7、SQL约束

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 7、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;

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL Oracle 关系型数据库
CREATE TABLE 时的 SQL FOREIGN KEY 约束
【7月更文挑战第24天】CREATE TABLE 时的 SQL FOREIGN KEY 约束。
42 5
|
2月前
|
SQL Oracle 关系型数据库
ALTER TABLE 时的 SQL PRIMARY KEY 约束
【7月更文挑战第24天】ALTER TABLE 时的 SQL PRIMARY KEY 约束。
23 3
|
2月前
|
SQL Oracle 关系型数据库
CREATE TABLE 时的 SQL FOREIGN KEY 约束
【7月更文挑战第19天】CREATE TABLE 时的 SQL FOREIGN KEY 约束
34 8
|
2月前
|
SQL Oracle 关系型数据库
CREATE TABLE 时的 SQL PRIMARY KEY 约束
【7月更文挑战第24天】CREATE TABLE 时的 SQL PRIMARY KEY 约束。
34 2
|
2月前
|
SQL Oracle 关系型数据库
SQL CHECK 约束
【7月更文挑战第19天】SQL CHECK 约束。
32 5
|
2月前
|
SQL Oracle 关系型数据库
SQL UNIQUE 约束
【7月更文挑战第18天】SQL UNIQUE 约束。
36 6
|
2月前
|
SQL
SQL NOT NULL 约束
【7月更文挑战第18天】SQL NOT NULL 约束。
35 6
|
2月前
|
SQL Oracle 关系型数据库
SQL PRIMARY KEY 约束
【7月更文挑战第19天】SQL PRIMARY KEY 约束。
39 4
|
2月前
|
SQL Oracle 关系型数据库
SQL UNIQUE 约束
【7月更文挑战第19天】SQL UNIQUE 约束。
31 4
|
2月前
|
SQL Oracle 关系型数据库
ALTER TABLE 时的 SQL PRIMARY KEY 约束
【7月更文挑战第19天】ALTER TABLE 时的 SQL PRIMARY KEY 约束。
30 3