没有明确写明数据库时,默认基于oracle
约束的分类
用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束,区别在于定义的位置和作用范围
![](https://i-blog.csdnimg.cn/direct/25a3fbcb1e3142b1af7a1d78f2ab2fb0.png)
![](https://i-blog.csdnimg.cn/direct/d8a115b0e09849729a586a448a699508.png)
复合主键约束: 主键约束中有2个或以上的字段
复合主键的列顺序会影响索引的使用,需谨慎设计
![](https://i-blog.csdnimg.cn/direct/fad15b42a97c4014b77ebfb7b3972c2f.png)
![](https://i-blog.csdnimg.cn/direct/6dd6100309c149be92e5286fc4dacc84.png)
添加约束
oracle会自动为主键约束, 唯一约束, 外键约束创建索引, 以提高查询性能
在已存在的表上添加约束
![](https://i-blog.csdnimg.cn/direct/86aad9a7e65946c781187b843a648242.png)
添加约束注意:
主键约束: 如果表中已经存在重复数据或 NULL 值,无法添加主键约束, 在对已经存在的表添加主键之前先检查数据, 处理重复值和NULL值
非空约束:如果表中已经存在NULL值,无法添加,添加前先检查是否存在NULL值
![](https://i-blog.csdnimg.cn/direct/edd2d50204c84a0a8331d335a904e35c.png)
删除约束
![](https://i-blog.csdnimg.cn/direct/7f32ea3b8d7c4b34bbb6d532505297f9.png)
查看约束
使用数据字典视图:
-
USER_CONSTRAINTS
:查看当前用户拥有的约束。 -
ALL_CONSTRAINTS
:查看当前用户可以访问的所有约束。 -
DBA_CONSTRAINTS
:查看数据库中所有约束(需要DBA权限)。
![](https://i-blog.csdnimg.cn/direct/ec65439d92024d1999c944b836c8f565.png)
![](https://i-blog.csdnimg.cn/direct/730ba18c2a7c45f5a2abbe2ab6d76609.png)
![](https://i-blog.csdnimg.cn/direct/673cd1f4c96146679b9b9d3af88fed4d.png)
启用/禁用约束
启用约束
![](https://i-blog.csdnimg.cn/direct/648d29746af34609af31824764ab5273.png)
禁用约束
]
在使用列级约束时并没有定义约束的名称, 但是Oracle 会自动为约束生成一个默认名称。这些默认名称通常以 SYS_C
开头,后面跟随一串数字。要查看这些自动生成的约束名称,你可以查询数据字典视图 USER_CONSTRAINTS
或 ALL_CONSTRAINTS
。
外键约束
外键约束(Foreign Key Constraint)用于确保表之间的引用完整性。外键约束定义了一个表中的列(或一组列)必须与另一个表中的主键或唯一键列的值相匹配。外键约束可以防止在子表中插入无效的数据,并可以定义在删除或更新父表中的数据时的行为。
![](https://i-blog.csdnimg.cn/direct/abf3f6f5655b4f9a900db8e5ff6dab6c.png)
[ON DELETE CASCADE | ON DELETE SET NULL]
是用于定义外键约束时,指定当父表中的记录被删除时,子表中相关记录应如何处理的可选子句。
![](https://i-blog.csdnimg.cn/direct/e5e332131a2347d5b45b176097df8a22.png)
oracle的主键自增: 序列和触发器
![](https://i-blog.csdnimg.cn/direct/cb616a6643444941be7eefefc85819f3.png)
在 Oracle 数据库中, 通过以下两种方式实现主键自增
![](https://i-blog.csdnimg.cn/direct/c675b645fe7849b7b5bdf61c2a8d7355.png)
![](https://i-blog.csdnimg.cn/direct/f7e6ab010ed24769801939fb9e8320a4.png)
![](https://i-blog.csdnimg.cn/direct/29db7bb086f94a1db7b88aea132000e3.png)
![](https://i-blog.csdnimg.cn/direct/8d098b23418b4bf39d9d175b9d113f9b.png)
![](https://i-blog.csdnimg.cn/direct/1b0c11c2e95d4987a245f0a5326f98f1.png)
2种方法在高并发环境下的表现
![](https://i-blog.csdnimg.cn/direct/ccb468b595124dd78a8180a13e1c742a.png)
在高并发环境下,Oracle如何确保自增值的唯一性
序列:
![](https://i-blog.csdnimg.cn/direct/0bdde0e367a7431ca943fe228dfc671c.png)
触发器:
在插入数据时自动从序列中获取下一个值并赋值给主键列。触发器确保在插入操作时自动生成唯一的主键值
其他数据库的主键自增
mysql
![](https://i-blog.csdnimg.cn/direct/1686f231eff4464d9f2c4261ea5fcb0c.png)
GaussDB高斯数据库
![](https://i-blog.csdnimg.cn/direct/c7ce9886b5df4251a3d5067d239cf1e8.png)
在多个表中使用同一个序列时,会导致表中的序列号不连续。为了避免这种情况,建议为每个表创建独立的序列,以确保每个表的自增值连续且不受其他表的影响。
![](https://i-blog.csdnimg.cn/direct/5a8e0d2cb1214ff4a6a3ac262c04dda4.png)
PostgreSQL
方法一: SERIAL
![](https://i-blog.csdnimg.cn/direct/925861b7bbba4c6fbcd4e2470b8fbdea.png)
方法二: IDENTITY
![](https://i-blog.csdnimg.cn/direct/da5b48f8a36449f19329d786dde1d846.png)
GENERATED BY DEFAULT AS IDENTITY >>默认情况下作为标识生成
![](https://i-blog.csdnimg.cn/direct/d564c944ef574f798d56469655423287.png)
序列 sequence
![](https://i-blog.csdnimg.cn/direct/bb9819e09b7042d4bd936b62275c583c.png)
![](https://i-blog.csdnimg.cn/direct/5b40c0d6d03645aca81ac7cd5e60b758.png)
![](https://i-blog.csdnimg.cn/direct/239320dd2ab04df18204eaa22787a97d.png)
![](https://i-blog.csdnimg.cn/direct/d8f6375fafba4bc1a1babe50c58b081e.png)
-- 插入数据时使用序列
INSERT INTO Users (UserID, UserName)
VALUES (序列名.NEXTVAL, 'John Doe');
-- 获取当前序列值
SELECT 序列名.CURRVAL FROM dual;
![](https://i-blog.csdnimg.cn/direct/f1185f95a649425699884edbc498d527.png)
![](https://i-blog.csdnimg.cn/direct/0226b4dccb4141898f8cfd4d1fb603eb.png)
查看序列
方法一:
![](https://i-blog.csdnimg.cn/direct/e3751ea589324cb19c73088e7a6b8c51.png)
如果你有权限访问其他用户的序列,可以使用 ALL_SEQUENCES
视图; (语法如上)
如果你有DBA权限,可以使用 DBA_SEQUENCES
视图查看数据库中所有序列的信息;(语法如上)
方法二:
![](https://i-blog.csdnimg.cn/direct/ad093cffef9a4d3f890d938f5ad7cfe1.png)