您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

sql完整性约束有哪些

2025/10/6 2:39:56发布17次查看
sql完整性约束有:1、“not null”非空约束,指定的列不允许为空值;2、“unique”唯一约束,指定列中没有重复值;3、“primary key”主键约束,唯一的标识出表的每一行;4、“foreign key”外键约束;5、“check”条件约束。
完整性约束是保证用户所做的修改不会破坏数据的一致性,是保护数据正确性和相容性的一种手段。
常见的5种约束:
not null:非空约束c,指定的列不允许为空值
unique:唯一约束u,指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的
primary key:主键约束p,唯一的标识出表的每一行,且不允许空值,一个表只能有一个主键约束
foreign key:外键约束r,一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列
check:条件约束c,指定该列是否满足某个条件
非空约束 nk
create table member( mid number, name varchar2(200) not null );
插入空报错:
sql> insert into member(mid,name) values(1,null);*第 1 行出现错误:ora-01400: 无法将 null 插入 ("scott"."member"."name")
唯一约束 uk
drop table member purge;create table member( mid number, name varchar2(200) not null, email varchar2(50) unique );
插入报错
sql> insert into member(mid,name,email) values (1,'scott','scott@163.com');
已创建 1 行。
sql> insert into member(mid,name,email) values (2,'jack','scott@163.com');insert into member(mid,name,email) values (2,'jack','scott@163.com')*第 1 行出现错误:ora-00001: 违反唯一约束条件 (scott.sys_c0010891)
给约束指定名字
这错误并没有像之前的非空约束那样,准确告诉用户哪个字段出现了问题,我们可以给这个约束指定一个名字
create table member( mid number, name varchar2(200) not null, email varchar2(50), constraint uk_email unique(email) );
主键约束 pk
主键约束=非空约束+唯一约束
create table member( mid number, name varchar2(200) not null, email varchar2(50), constraint pk_number primary key(mid), constraint uk_email unique(email) );
插入错误的数据报错:
sql> insert into member(mid,name,email) values (1,'jack','scott@163.com');
已创建 1 行
sql> insert into member(mid,name,email) values (1,'jack','jack@163.com');insert into member(mid,name,email) values (1,'jack','jack@163.com')*第 1 行出现错误:ora-00001: 违反唯一约束条件 (scott.pk_number)
检查约束 ck
create table member( mid number, name varchar2(200) not null, age number check(age between 0 and 200), sex varchar2(10), email varchar2(50), constraint pk_number primary key(mid), constraint uk_email unique(email), constraint ck_sex check(sex in('男','女')) );
插入错误数据报错:
sql> insert into member(mid,name,age,sex,email) values (1,'jack','300','无','jack@163.com');insert into member(mid,name,age,sex,email) values (1,'jack','300','无','jack@163.com')*第 1 行出现错误:ora-02290: 违反检查约束条件 (scott.ck_sex)
主外键约束 fk
create table member( mid number, name varchar2(200) not null, constraint pk_mid primary key(mid) ); create table advice( adid number, content clob not null, mid number, constraint pk_adid primary key(adid), constraint fk_mid foreign key(mid) references member(mid) );
正确插入数据,mid在附表中已经存在
insert into member(mid,name) values (1,'scott');insert into member(mid,name) values (2,'jack');insert into advice(adid,content,mid) values (1,'test',1);insert into advice(adid,content,mid) values (2,'test',2);commit;
插入一条父表中没有的mid数据
sql> insert into advice(adid,content,mid) values (3,'test',3);insert into advice(adid,content,mid) values (3,'test',3)*第 1 行出现错误:ora-02291: 违反完整约束条件 (scott.fk_mid) - 未找到父项关键字
采用主外键约束会在表的删除和数据删除方面存在新的问题
删除父表得先删除子表
sql> drop table member;drop table member *第 1 行出现错误:ora-02449: 表中的唯一/主键被外键引用
强制性删除父表,这样就不能使用purge选项了,并且字表中的主外键约束也将不复存在
sql> drop table member cascade constraint;表已删除。sql> insert into advice(adid,content,mid) values (3,'test',3);
已创建 1 行
删除父表的数据的先删除字表中的数据
sql> delete from member where mid=1;delete from member where mid=1*第 1 行出现错误:ora-02292: 违反完整约束条件 (scott.fk_mid) - 已找到子记录
除了这种方法外还可以设置级联操作子句
on delete cascade
create table advice( adid number, content clob not null, mid number, constraint pk_adid primary key(adid), constraint fk_mid foreign key(mid) references member(mid) on delete cascade );
这样的话,删除附表数据,会把字表中的数据也给删除。
on delete set null
create table advice( adid number, content clob not null, mid number, constraint pk_adid primary key(adid), constraint fk_mid foreign key(mid) references member(mid) on delete set null );
这样删除父表中的数据,子表中的对应的关联字段将被设置为空
sql> delete from member where mid=1;已删除 1 行。sql> select * from advice; adid content mid---------- ---------- ----------  testtest 2
查看约束
sql> select constraint_name,constraint_type,table_name from user_constraints; constraint_name c table_name------------------------------ - ------------------------------fk_deptno r emppk_emp p emppk_dept p dept
r外键约束,c检查约束,q唯一约束,p主键约束
修改约束
增加约束
alter table member add constraint pk_mid primary key(mid);alter table member add constraint ck_age check(age between 0 and 200);alter table member modify (name varchar2(50) not null);
需要注意的是非空约束使用的是modify的方式
禁用/启用约束
非外键
alter table member disable constraint ck_age;alter table member enable constraint ck_age;
外键
alter table member disable constraint pk_mid cascade;
删除约束
alter table member drop constraint pk_mid cascade;alter table member drop constraint ck_age;
以上就是sql完整性约束有哪些的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product