当我们在创建数据库的表和字段时,我们总是说要声明约束,那约束究竟是什么呢?那么又如何在创建表时或者已经创建好了表之后通过添加删除来怎样进行约束呢?听我来说说吧!
【前言】
分为了五个部分:
- NOT NULL:指定某列不能存储NULL(未知,但不是空)值,强制要求字段必须要包含值
- UNIQUE:唯一约束,防止一个特定的列中两个记录有一致的值
- CHECK:检查约束,保证列中的值符合指定的条件。用于限制列中的值的范围
- PRIMARY KEY:主键约束,确保某列必须要有唯一标识符
- FOREIGN KEY:外键约束,主键和外键创建了不同表中数据的相互关系
分为了两种情况:
在创建表时规定(CREATE TABLE table_name)
在创建表之后规定(ALTER TABLE table_name)
【正文】
一、NOT NULL
在默认情况下,表接受NULL 值
约束强制列不接受NULL 值
<**举例**>
CREATE TABLE table_name语句
现要创建一个学生信息表,对表中的列进行约束
CREATE TABLE Student ( SId int NOT NULL, SAge int NOT NULL );
ALTER TABLE table_name语句
添加NOT NULL约束
ALTER TABLE Student ADD COLUMN Student int NOT NULL; 在一个创建好的学生信息表中添加NOT NULL约束
二、UNIQUE
唯一约束
防止一个特定的列中两个记录有一致的值
<**举例**>
CREATE TABLE table_name语句
现要创建一个学生信息表,对SName列进行UNIQUE约束
CREATE TABLE Student ( SId int, SName varchar(50) SAge int UNIQUE );
当要对多个列进行约束时:对SId列和SName列进行UNIQUE约束
CREATE TABLE Student ( SId int, SName varchar(50) SAge int UNIQUE, CONSTRAINT uc_PersonId UNIQUE (SId, SName) );
ALTER TABLE table_name语句
添加UNIQUE约束:
ALTER TABLE Student ADD UNIQUE (SId) 对SId列添加UNIQUE约束
ALTER TABLE Student ADD CONSTRAINT uc_PersonID UNIQUE (SId, SName) 当要对多个列进行约束时:对SId列和SName列进行UNIQUE约束
删除UNIQUE约束:
ALTER TABLE Student DROP CONSTRATIN uc_PersonId
注:在对ALTER TABLE table_name语句进行UNIQUE约束时,会发现多了一个uc_PersonId,这个是什么呢?
uc_PersonId是一个联合约束名,就是UNIQUE CONSTRAINT的缩写(意思是唯一约束),就是对表中的SId列和SName列进行强制约束。
三、CHECK
检查约束
保证列中的值符合指定的条件
用于限制列中的值的范围
<**举例**>
CREATE TABLE table_name语句
现要建一个学生信息表,对表中的SAge列进行范围约束
CREATE TABLE Student ( SId int NOT NULL, SName varchar(50) NOT NULL, SAge int CHECK(SAge >= 0) );
从语句中我们可以看出,对SAge这个列进行了一个CHECK约束,强制要求它的范围必须大于等于0,按照常识,我们的年龄不可能比0还小,当它超出了所约束的范围时,系统就会报错
当要对多个列进行约束时:对SId列和SName列进行CHECK约束
CREATE TABLE Student ( SId int NOT NULL, SName varchar(50), SAge int NOT NULL, CONSTRAINT chk_PersonId (SId >0 AND SAge >=0)
ALTER TABLE table_name语句
添加约束:
ALTER TABLE Student ADD CHECK (SId>0)
ALTER TABLE Student ADD CONSTRAINT chk_PersonId CHECK (SId >0 AND SAge >=0) 对多行表进行约束 对已创建好的Student表中的SId列和SAge列进行约束
删除约束:
ALTER TABLE Student DROP CONSTRAINT chk_PersonId
四、PRIMARY KEY
主键约束
在所有约束中,最重要的,也最常用。要向符合第一范式,则每个表中都必须有一个主键(提供表之间的链接)
是UNIQUE约束和NOT NULL约束的组合
确保某列必须要有唯一标识符
主键约束不可重复,不可NULL值
<**举例**>
CREATE TABLE table_name 语句
现要创建一个学生信息表,对SId列进行主键PRIMARY KEY约束
CREATE TABLE Student ( SId int NOT NULL PRIMARY KEY, SName varchar(50) NOT NULL, SAge int NOT NULL );
ALTER TABLE table_name语句
添加约束
ALTER TABLE Student ADD PRIMARY KEY (SId) 对SId列进行PRIMARY KEY约束
ALTER TABLE Student ADD CONSTRAINT uc_PersonId PRIMARY KEY (SId, SName) 对SId列和SName列进行联合主键约束
删除PRIMARY KEY约束
ALTER TABLE Student DROP CONSTRAINT uc_PersonId
到这里我们就会有一个疑问了,明明一个表中只能有一个字段为主键,为什么这里还要联合多列为主键呢?其实我当时也有过这样的疑惑。请点击:mysql的联合主键与复合主键区别 - 简书
当我们约束PRIMARY KEY时,还需要特别注意一点:当对某列或者多个列进行PRIMARY KEY约束时,一定要保证你所约束的字段是NOT NULL的,如果不是,系统就会报错,无法进行约束。电脑前的小伙伴可以试试:当你所约束的字段不是NOT NULL时会时什么样的,自己动动手指试试吧!我当时就上了这个当,你们一定要谨记哈
五、FOREIGN KEY
外键约束
主键和外键创建了不同表中数据的相互关系
可能对这段抽象的文字有点疑惑。我来举个例子来看看吧
现有分别有两张学生信息表和学生所喜爱的电影信息表
Student
SIde | SAge | SName |
1 | 17 | 春花 |
2 | 19 | 夏雪 |
3 | 15 | 秋月 |
Films
FilmId | Rating | SId |
1 | 2 | 1 |
2 | 4 | 3 |
3 | 1 | 2 |
从图中我们会发现:Student表中的SId列是Student表的PRIMARY KEY
Films表中的SIde列是Films表中的FOREIGN KEY
Student表中的SId列指向了Films表中的SId
Student表和Films表中的主键和外键使两个表创建了连接关系
举例
CREATE TABLE table_name语句
现有一个Student表,创建一个Films表,对SIde列进行外键约束
CREATE TABLE Films ( FilmId int NOT NULL PRIMARY KEY, Rating int NOT NULL, SId int FOREIGN KEY REFERENCES Student(SId) );
前提:必须有另一个已经建好的要联系的表
ALTER TABLE table_name语句
添加主键
ALTER TABLE Films ADD CONSTRAINT fk_StuFils FOREIGN KEY (SId) REFERENCES Student (SId)
删除主键
ALTER TABLE Films DROP CONSTRAINT fk_StuFils