常用约束分类:列级约束 和 表级约束
一、概述
CREATE TABLE 数据表名 (
列名1 列数据类型 【列级约束1】 # 由于列级约束不支持取名,外键又有取名需求,不支持外键,但不会报错。
列名2 列数据类型 【列级约束1】【列级约束2】...,#允许添加多个列级约束,约束类型之间用 空格 隔开。
.........
【表级约束】 #不支持非空约束和默认约束,一般只用于写外键约束
)
说明:如果没有加约束,对于一个学生信息表,就可能由于粗心,导致第一行和第二行 出现重复序号,重复学号,显然不合理。就可以添加约束避免。
- 列级约束语法:(不支持取名,不支持外键约束)
直接在列数据类型后面加约束类型关键字(NOT NULL/DEFAULT...)即可。
- 表级约束语法 (可以为约束取名)
在数据表的最后一个列名之后,可添加表级约束。
【CONSTRAINT 约束名】 约束类型(列名), # 约束名,就是为这个约束的名字,随便取,但是主键名就是PRIMARY,改了别的名字也没用。 约束类型就是NOT NULL等。 注意,所有约束类型都有默认名,所以允许不给约束取名字,即constraint部分省略也没事。
- 一般写法
一般一个表都可以有多个外键(取名区分外键) 并且 外键只支持表级约束,
所以 外键约束写表级约束,其他约束都写成列级约束。外键约束取名规则一般为 FK_本表名_引用的主表名
二、约束类型 五大约束 (其他数据库还有check约束,由于是mysql,就没有啦)
1、NOT NULL:非空约束 指 该列值不能为空,必须填。 比如姓名,学号,可添加非空约束。就像我们填写网络表格的时候,那些带*要求的必填项。
2、DEFAULT:默认约束 指 用于保证该列有默认值。比如对该列添加了默认约束以后,后续使用插入语句的时候不插入值也就没关系了,因为会显示默认值。 比如在女子学院,就可以对性别 添加 “女” 的默认约束。
格式 DEFAULT +(该列数据类型对应的值)。比如默认年龄20岁: age INT DEFAULT 20,
3、PRIMARY KEY: 主键约束 指 用于保证该列的值具有唯一性,并且主键自带非空性。比如学生表的学号,肯定唯一,就可以设置成主键。一个表中只能有一个。但是允许一个表的两列合并成一个主键。exp:PRIMARY KEY(列1,列2), 指列1和列2 合并成一个主键。合并完成以后,新插入行的列1和列2同时 和前面的数据相同 才会报错。
4、UNIQUE: 和PRIMARY KEY一样,差异就是UNIQUE允许为空,同时允许设置多个UNIQUE。用于不能重复,但允许为空的列,比如座位号,就不能重复,但可以空,就可以设置成UNIQUE。同样允许多列合并组合成新主键
5、FOREIGN KEY: 外键约束 限制两个表的关系,用于保证该列的值必须来自于主表关联列的值。☆在从表添加外键约束,代表此列引用的主表的某列的值。注意外键约束的两个表的列,数据类型必须一致。常用的外键约束有,专业编号,部门编号,工种编号。由于一个表可以有多个外键,而列级约束不支持取名,所以不能用于列级约束,只用于表级约束。通用取名方式为:FK_本表名_引用的主表名。
☆:外键引用的其他主表的列,必须是一个KEY,(一般是PRIMARY 或者 UNIQUE,最好是PRIMARY)
格式:【CONSTRAINT 约束名】 FOREIGN KEY('列名') REFERANCES 主表名(列名);
下表:CONSTRAINT fk_学生表_专业表 FOREIGN KEY(‘专业ID’ ) REFERENCES `专业表`(‘专业ID’);
三、添加约束的应用
3.1、创建数据表的时候
(1)添加列级约束 直接在列数据类型后面加约束类型关键字
CREATE TABLE StuInfo(
id INT PRIMARY KEY, #列名 id,数据类型 INT , 约束 PRIMARY KEY(主键)
StuName VARCHAR(20) NOT NULL, #列名StuName,数据类型VARCHAR,约束NOT NULL(非空)
SeatNo INT UNIQUE ,#列名SeatNo,数据类型INT,约束UNIQUE(唯一约束,允许空)
age INT DEFAULT 18, #列名age,数据类型INT,约束DEFAULY(默认约束,默认值18)
);
(2)添加表级约束 【CONSTRAINT 约束名】 约束关键词(列名)
CREATE TABLE StuInfo(
id INT ,
StuName VARCHAR(20) ,
SeatNo INT ,
age INT DEFAULT 18,
CONSTRAINT PK PRIMARY KEY(id), #列名 id,添加 约束 PRIMARY KEY(主键)
CONSTRAINT uq UNIQUE(SeatNo),#列名SeatNo,添加 约束UNIQUE(唯一约束,允许空)
CONSTRAINT fk FOREIGN KEY(majorID) REFERENCES major(id), #列名 majorID,添加 约束FOREIGN KEY(外键约束,引用主表major的id列)
);
3.2、修改数据表的时候
ALTER TABLE 数据表名 MODIFY COLUMN 列名 列数据类型 约束类型;(常用列级约束写法)
ALTER TABLE 数据表名 ADD 约束类型(列名);(表级约束写法)
可添加非空约束,默认约束,主键,外键(外键只有表级写法)
例如:把前面StuInfo数据表里的年龄列的默认值从18改成24 (默认约束例子)
ALTER TABLE StuInfo MODIFY COLUMN age INT DEFAULT 24;
例如:把StuInfo的ID,添加主键(假如前面没有设置主键)(主键约束例子)
ALTER TABLE StuInfo MODIFY COLUMN id INT PRIMARY KEY ; #列级写法
ALTER TABLE StuInfo ADD 【CONSTRAINT fk】 PRIMARY KEY(id); #表级写法
例如:给StuINfo数据表的majorID 添加外键约束,关联主表为major的id项(外键约束例子)
ALTER TABLE StuInfo ADD FOREIGN KEY(majorID) REFERENCES major(id);
3.3 删除约束
1、删除非空约束、默认约束、主键,唯一(支持列级写法的)都可以直接用3.2的方法,把约束改成没有就是了。
2、删除主键、唯一的表级写法:
ALTER TABLE 数据表名 DROP PRIMARY KEY; #主键只有一个,可以这样写
ALTER TABLE 数据表名 DROP INDEX 唯一键的名字; #UNIQUE唯一键可以有多个,所以用索引来删除。唯一键的名字,可通过 SHOW INDEX FROM 数据表; 来查询。
3、删除外键(外键没列级写法,只能表级写法删除)
ALTER TABLE 数据表名 DROP FOREIGN KEY 外键名;
四、标识列 AUTO_INCREMENT
又称为自增长列,可以不用手动插入值,系统提供默认的序列值,默认从1开始,每次插入自动+1。一旦设置了标识列以后,插入就很省事了
语法: 创建数据表、修改数据表时,在想要自增的列约束后面添加 AUTO_INCREMENT
说明:加入自增长以后,插入数据时,对应的列就不用管了,但为了表达式美观,可以写个NULL。起始值默认是1,但是你想起始值是10,可以在第一句id的位置写10,就可以从10开始了
#创建tab_identity数据表时创建一个标识列
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
#创建成功以后,向数据表中插入数据即可使用,在id的位置,赋值10,因此从10开始自增长
INSERT INTO tab_identity(id,NAME) VALUES(10,'john');
#这种写法更省事,直接省略了自增列(标识列)id,接着10开始,lucy在第11位
INSERT INTO tab_identity(NAME) VALUES('lucy');
如何更改公差(步长)
SET auto_increment_increment = 3; //即可按照1、4、7、10的顺序自动增长
总结:
(1)标识列必须只能和key搭配,即和 PRIMARY KEY,UNIQUE,FOREIGN KEY配合
(2)一个表至多一个标识列
(3)标识列的类型只能是数值型(int、float、double等),一般是int