暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL约束


1. MySQL约束

一、约束的作用

约束(constraint)是数据库用来提高数据质量和保证数据完整性的一套机制

约束作用在表列上,是表定义(DDL语句)的一部分

二、约束分类

非空约束 (not null)

insert,update数据时是不允许空值(null)

唯一性约束 (unique)

insert,update数据时不允许重值,可以允许空值,自动创建唯一性索引

主键约束 (primary key)

非空约束 + 唯一约束。主键的列不允许有重值和空值,自动创建唯一性索引

外键约束 (foreign key)

引用主键构成完整性约束。允许有空值,不允许存在对应主键约束的列所有数值以外的其它值

三、约束的定义方式

创建表时建立约束(事中)

建表之前就已经规划好了

列级定义

create table t (id int primary key,name char(10));

表级定义

create table t (id int,name char(10),primary key(id));

修改表时追加约束(事后)

建表之后根据需要追加

追加定义

alter table t add primary key(id);

四、查看约束

desc table_name;

show create table table_name\G

show keys from table_name; 看不了非空约束

show index from table_name;看不了非空约束

2、非空约束

非空约束用于确保其所在列的值不能为空值null

只有列级定义和追加定义

语法

列级定义

create table t (id int not null,name char(10));

追加定义

alter table t modify name char(10) not null;

测试

insert into t (id,name) values(null,null); 报错

insert into t (id,name) values(1,null);报错

insert into t (id) values(1); 报错,因为没有指定name值,默认用null填充

insert into t values(1,‘a’); 成功

运行为空

alter table t modify id int null;

设置默认值

alter table t modify id int null default 100;

alter table t modify name char(10) default ‘abc’;

insert into t (id) values(2); 成功,没有指定name值用默认值填充

drop table t; 删除t表,表列和行记录都没有了

3、唯一约束

表列中不允许有重复值,但是可以有空值

语法

列级定义

create table t1 (id int unique,name char(10));

表级定义

create table t2 (id int,name char(10),unique(id));

追加定义

create table t3(id int,name char(10));

alter table t3 modify id int unique;

测试

insert into t1 values(1,‘a’);

insert into t1 values(1, ‘a’); 报错,id中不允许重值,2个1

insert into t1 values(null, ‘b’); 成功,id允许有空值

删除unique约束

show keys from t1;

drop index id on t1;

desc t1;

drop table t1,t2,t3;

4. 主键约束

非空约束 + 唯一约束。主键的列不允许有重值和空值,自动创建唯一性索引

语法

列级定义

create table t1 (id int primary,name char(10));

表级定义

create table t2 (id int,name char(10),primary key(id));

追加定义

create table t3(id int,name char(10));

alter table t3 modify id int primary key;


测试

insert into t1 values(1,‘a’);

insert into t1 values(1, ‘a’); 报错,id中不允许重值,2个1

insert into t1 values(null, ‘b’); 报错,id不允许有空值

删除primary key约束

show keys from t1;

alter table t1 drop primary key;

show keys from t1; 自动创建的索引被删除

desc t1;  非空约束还在,没有被级联删除

alter table t2 add primary key(name); 失败,t2表已有主键,一个表不能有多个主键,可以建立非空+** 唯一约束代替

alter table t2 modify name char(10) not null unique; 成功

desc t2;drop table t1,t2,t3;

5. 外键约束

1.引用主键构成完整性约束。外键允许有空值,不允许存在对应主键约束的列所有数值以外的其它值。MySQL自动创建非唯一性索引

2.语法 (1个表)

表级定义

create table t1(id int,name char(10),pid int,primary key(id),foreign key(pid) references t1(id));

追加定义

create table t2(id int,name char(10),pid int);

alter table t2 add primary key(id);

alter table t2 add foreign key(pid) references t2(id);

3. 语法 (2个表)

表级定义

–先建立外键要引用的主表

create table c (cid int primary key,cname char(10));

– 再建立包含外键的从表

create table s (sid int,sname char(10),cid int,foreign key(cid) references c(cid));

追加定义

create table s1 (sid int,sname char(10),cid int);

alter table s1 add foreign key(cid) references c(cid);

4. 测试

insert into s (sid,sname,cid) values(1,‘张三’,101);报错,因为c表中cid不存在100的值,当前c表中没有任何记录

insert into c (cid,cname) values(101,‘1班’); c表中插入cid为101的值

insert into s (sid,sname,cid) values(1,‘张三’,101);再次插入成功

insert into s (sid,sname,cid) values(2,‘李四’,null); 插入成功,外键列可以有空值

4. 删除s表cid列中的外键约束

先要找出s表cid上外键约束的名称

mysql> select * from information_schema.key_column_usage where table_name=‘s’ and referenced_table_name is not null\G

然后再删除s表cid上的外键约束

mysql>alter table s drop foreign key s_ibfk_1;


文中的概念来源于网络,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。欢迎觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。

最后修改时间:2024-04-28 18:49:38
文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论