这篇文章将为大家详细讲解有关sql中常见的5种约束是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

sql完整性约束有:非空约束,唯一约束,主键约束,外键约束,条件约束等

完整性约束是保证用户所做的修改不会破坏数据的一致性,是保护数据正确性和相容性的一种手段。

常见的5种约束:

NOT NULL:非空约束C,指定的列不允许为空值

UNIQUE:唯一约束U,指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的

PRIMARY KEY:主键约束P,唯一的标识出表的每一行,且不允许空值,一个表只能有一个主键约束

FOREIGN KEY:外键约束R,一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列

CHECK:条件约束C,指定该列是否满足某个条件

非空约束 NK

createtablemember(midnumber,namevarchar2(200)notnull);

插入空报错:

SQL>insertintomember(mid,name)values(1,null);*第1行出现错误:ORA-01400:无法将NULL插入("SCOTT"."MEMBER"."NAME")

唯一约束 UK

droptablememberpurge;createtablemember(midnumber,namevarchar2(200)notnull,emailvarchar2(50)unique);

插入报错

SQL>insertintomember(mid,name,email)values(1,'scott','scott@163.com');

已创建 1 行。

SQL>insertintomember(mid,name,email)values(2,'jack','scott@163.com');insertintomember(mid,name,email)values(2,'jack','scott@163.com')*第1行出现错误:ORA-00001:违反唯一约束条件(SCOTT.SYS_C0010891)

给约束指定名字

这错误并没有像之前的非空约束那样,准确告诉用户哪个字段出现了问题,我们可以给这个约束指定一个名字

createtablemember(midnumber,namevarchar2(200)notnull,emailvarchar2(50),constraintuk_emailunique(email));

主键约束 PK

主键约束=非空约束+唯一约束

createtablemember(midnumber,namevarchar2(200)notnull,emailvarchar2(50),constraintpk_numberprimarykey(mid),constraintuk_emailunique(email));

插入错误的数据报错:

SQL>insertintomember(mid,name,email)values(1,'jack','scott@163.com');

已创建 1 行

SQL>insertintomember(mid,name,email)values(1,'jack','jack@163.com');insertintomember(mid,name,email)values(1,'jack','jack@163.com')*第1行出现错误:ORA-00001:违反唯一约束条件(SCOTT.PK_NUMBER)

检查约束 CK

createtablemember(midnumber,namevarchar2(200)notnull,agenumbercheck(agebetween0and200),sexvarchar2(10),emailvarchar2(50),constraintpk_numberprimarykey(mid),constraintuk_emailunique(email),constraintck_sexcheck(sexin('男','女')));

插入错误数据报错:

SQL>insertintomember(mid,name,age,sex,email)values(1,'Jack','300','无','jack@163.com');insertintomember(mid,name,age,sex,email)values(1,'Jack','300','无','jack@163.com')*第1行出现错误:ORA-02290:违反检查约束条件(SCOTT.CK_SEX)

主外键约束 FK

createtablemember(midnumber,namevarchar2(200)notnull,constraintpk_midprimarykey(mid));createtableadvice(adidnumber,contentclobnotnull,midnumber,constraintpk_adidprimarykey(adid),constraintfk_midforeignkey(mid)referencesmember(mid));

正确插入数据,mid在附表中已经存在

insertintomember(mid,name)values(1,'Scott');insertintomember(mid,name)values(2,'Jack');insertintoadvice(adid,content,mid)values(1,'test',1);insertintoadvice(adid,content,mid)values(2,'test',2);commit;

插入一条父表中没有的mid数据

SQL>insertintoadvice(adid,content,mid)values(3,'test',3);insertintoadvice(adid,content,mid)values(3,'test',3)*第1行出现错误:ORA-02291:违反完整约束条件(SCOTT.FK_MID)-未找到父项关键字

采用主外键约束会在表的删除和数据删除方面存在新的问题

删除父表得先删除子表

SQL>droptablemember;droptablemember*第1行出现错误:ORA-02449:表中的唯一/主键被外键引用

强制性删除父表,这样就不能使用purge选项了,并且字表中的主外键约束也将不复存在

SQL>droptablemembercascadeconstraint;表已删除。SQL>insertintoadvice(adid,content,mid)values(3,'test',3);

已创建 1 行

删除父表的数据的先删除字表中的数据

SQL>deletefrommemberwheremid=1;deletefrommemberwheremid=1*第1行出现错误:ORA-02292:违反完整约束条件(SCOTT.FK_MID)-已找到子记录

除了这种方法外还可以设置级联操作子句

on delete cascade

createtableadvice(adidnumber,contentclobnotnull,midnumber,constraintpk_adidprimarykey(adid),constraintfk_midforeignkey(mid)referencesmember(mid)ondeletecascade);

这样的话,删除附表数据,会把字表中的数据也给删除。

on delete set null

createtableadvice(adidnumber,contentclobnotnull,midnumber,constraintpk_adidprimarykey(adid),constraintfk_midforeignkey(mid)referencesmember(mid)ondeletesetnull);

这样删除父表中的数据,子表中的对应的关联字段将被设置为空

SQL>deletefrommemberwheremid=1;已删除1行。SQL>select*fromadvice;ADIDCONTENTMID------------------------------   test    test2

查看约束

SQL>selectconstraint_name,constraint_type,table_namefromuser_constraints;CONSTRAINT_NAMEC  TABLE_NAME-------------------------------------------------------------FK_DEPTNOR    EMPPK_EMPP    EMPPK_DEPTP    DEPT

R外键约束,C检查约束,Q唯一约束,P主键约束

修改约束

增加约束

altertablememberaddconstraintpk_midprimarykey(mid);altertablememberaddconstraintck_agecheck(agebetween0and200);altertablemembermodify(namevarchar2(50)notnull);

需要注意的是非空约束使用的是modify的方式

禁用/启用约束

非外键

altertablememberdisableconstraintck_age;altertablememberenableconstraintck_age;

外键

altertablememberdisableconstraintpk_midcascade;

删除约束

altertablememberdropconstraintpk_midcascade;altertablememberdropconstraintck_age;

关于sql中常见的5种约束是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。