MYSQL DDL(数据库定义语言) 常用约束

常用约束分类:列级约束  和  表级约束

一、概述

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’);

MYSQL DDL(数据库定义语言) 常用约束

三、添加约束的应用

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 外键名;