DDL-约束
ALTER 改变
TABLE 表
MODIFY:更改
COLUMN :列
CONSTRAINT:约束
REFERENCES:参考
REFERENCES 引用的表(列名)
常见约束
约束名不可以重复
控制某个字段
含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性(一致性)
分类:六大约束
nut null | 非空 | 保证该字段的值不能为空。例如:姓名,学号 |
default | 默认 | 保证该字段有默认值。例如:性别 |
primary key | 主键 | 保证该字段的唯一性,并且非空。例如:学号、员工编号 |
unique | 唯一 | 保证该字段的值具有唯一性,可以为空。例如:作为号 |
check | 检查约束 |
添加条件【MySQL不支持】(拆k) 例如:性别设置为char(1),可以填男女,也可以是任何一个字符,这时候就需要check 年龄也是 |
foreign key | 外键 |
用于限制两个表的关系。保证该字段的值必须来自于主表的关联列的值 在从表添加约束,用于限制主表中某列的值,类型必须一致,或者能够隐式的转换 例如:学生表的专业编号,员工的部门编号,员工表的工种编号 |
添加约束的时机:数据添加之前
1.创建表
2.修改表
一个列可以添加多个约束 空格隔开后 加就行了
约束的添加分类
列级约束:直接写在列的后面,不支持起名字
语法上六大约束都支持,但外键没有效果
只支持:默认、非空、主键、唯一
表级约束:写在最后(逗号隔开),支持起名字。主键名字固定起了也没用
除了非空、默认,其他的都支持。
只支持:主键、唯一、外键
位置 | 支持的约束类型 | 是否可以起约束名 | |
列级约束 | 列的后面 | 语法都支持,但外键没有效果 | 不可以 |
表级约束 | 所有列的后面 | 不支持默认、非空,其他的支持 | 可以,但对主键没有效果 |
列级约束可以在字段后 追加多个,之间用空格隔开,部分顺序
主键vs唯一
唯一性 | 是否容许为空 | 一个表中可以有多少个 | 两个列组合为一个 | |
主键 | √ | × | 最多一个,也可以没有 | √不推荐 |
唯一 | √ | √ | 可以有多个 | √不推荐 |
注意:
唯一:只能有一个为空,多一个报错
组合:两个有一个不一样就可以,两个都一样报错。
外键的特点:
①要求在从表设置外键关系(主表是被引用的)
②从表的外键列的类型,要和主表关联列的类型,一致或兼容(可以隐式的转换),意思也一样,名称无所谓
③主表的关联列必须是一个key(一般是:主键、唯一),外键就没有意义了唯一不重复的引用才有意义
④插入数据时先插入主表,再插入从表
删除数据时先删除从表,在删除主表
①创建表时
#语法 /* CREATE TABLE 表名( 字段名 字段类型 列级约束, 字段名 字段类型 列级约束, ) */ #创建数据库 CREATE DATABASE stu; #打开数据库 USE stu; #创建表 CREATE TABLE stuinfo( id INT PRIMARY KEY,#主键 stuName VARCHAR(20) NOT NULL,#非空 gender CHAR(1) CHECK(gender IN('男','女')),#检查 seat INT UNIQUE,#唯一 age INT DEFAULT 18,#默认约束 majorID INT REFERENCES major(id)#外键 ); #REFERENCES(瑞符瑞c子) CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); #查看表的结构 DESC stuinfo; #key索引 #查看表中的索引:主键、外键、唯一键 SHOW INDEX FROM stuinfo; /* TABLE哪个表 non_unique是否唯一 0唯一,其他非 key_name索引的名字 seq_in_index序列值 column_name哪个列 主键、外键、唯一键,都会自动生成索引 主键名是固定的,改名也没效果(MySQL是这样的,SqlServer和Oracle有效果) 其他的看不了,需要搭配desc使用查看约束 */ #删除表 DROP TABLE if EXISTS stuinfo;
表级约束
#语法 /* CREATE TABLE 表名( 字段名 字段类型, 字段名 字段类型, 【CONSTRAINT(康死吹t) 约束名(自定义)】 约束的类型(列名), 外键:【CONSTRAINT(康死吹t) 外键的约束名(自定义)】 约束的类型(列名) REFERENCES 表(列名) ) 主键名字固定,自定义不了 */ #创建表 CREATE TABLE stuinfo( id INT, stuName VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT, CONSTRAINT pk PRIMARY KEY(id),#主键 CONSTRAINT up UNIQUE(seat),#唯一键 CONSTRAINT ck CHECK(gender in('男','女')),#检查 CONSTRAINT fk_stuinfo_majorid FOREIGN KEY(majorid) REFERENCES major(id)#外键 ); #查看表中的索引 SHOW INDEX FROM stuinfo; #删除表 DROP TABLE if EXISTS stuinfo; #创建表 CREATE TABLE stuinfo( id INT, stuName VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT, PRIMARY KEY(id),#主键 UNIQUE(seat),#唯一键 CHECK(gender in('男','女')),#检查 FOREIGN KEY(majorid) REFERENCES major(id)#外键 ); #查看表中的索引 SHOW INDEX FROM stuinfo; #通用的写法:主键,唯一键列级,外键表级 CREATE TABLE IF NOT EXISTS stuinfo( id INT PRIMARY KEY,#主键 stuName VARCHAR(20) NOT NULL,#非空 gender CHAR(1), seat INT UNIQUE,#唯一 age INT DEFAULT 18,#默认约束 majorid INT, CONSTRAINT fk_当前表名_主表名 FOREIGN KEY(为谁设置) REFERENCES 引用主表(的列) ); #创建表 CREATE TABLE IF NOT EXISTS stuinfo(#IF EXISTS有 IF NOT EXISTS没有 id INT PRIMARY KEY,#主键 stuName VARCHAR(20) NOT NULL,#非空 gender CHAR(1), seat INT UNIQUE,#唯一 age INT DEFAULT 18,#默认约束 majorid INT, CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) ); #查看表中的索引 SHOW INDEX FROM stuinfo;
②修改表时
/* 1.添加列级约束 ALTER TABLE 表名 MODIFY COLUMN 列名 类型 新约束; 2.添加表级约束 ALTER TABLE 表名 ADD 【CONSTRAINT 约束别名】 约束类型(列名)【REFERENCES 表名(列名)】; */ #创建表 CREATE TABLE stuinfo( id INT, stuName VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT ) #删除表 DROP TABLE if EXISTS stuinfo; #1.添加非空约束(不是添加,是修改,和修改列的类型一样,直接在后面加) 改变 表 表名 更改 列 列名 类型(长度) 约束 ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL; #删除的时候不写,或者把not删掉 #查看表的结构 DESC stuinfo #2.添加默认约束 ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 19; #3.添加主键:因为主键支持列级约束和表级约束 #方式一:列级约束 ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY; #方式二:表级约束 ALTER TABLE stuinfo ADD PRIMARY KEY(id); #4.添加唯一键 #方式一:列级约束 ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; #方式二:表级约束 ALTER TABLE stuinfo ADD UNIQUE(seat); #5.添加外键:有两种 但是列级没效果 #方式二:表级约束 ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id); #方式二:加别名,没有就使用默认的 ALTER TABLE stuinfo ADD CONSTRAINT fk_majorid_major FOREIGN KEY(majorid) REFERENCES major(id); # 改变 表 表名 添加 【约束 约束名】 主键(列名);
③修改表时删除约束
#1.删除非空约束:不写就行了 ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20); 改变 表 stuinfo 更改 列 stuName #2.删除默认约束:不写就行了 ALTER TABLE stuinfo MODIFY COLUMN age INT; #3.删除主键:因为主键支持列级约束和表级约束 #方式一:列级约束:不写就行了 ALTER TABLE stuinfo MODIFY COLUMN id INT; #方式二:表级约束:ALTER TABLE 表名 DROP PRIMARY KEY(直接指明主键); ALTER TABLE stuinfo DROP PRIMARY KEY; #查看表中索引 SHOW INDEX FROM stuinfo; #4.删除唯一键:ALTER TABLE 表名 DROP INDEX 索引名; ALTER TABLE stuinfo DROP INDEX seat; #5.删除外键:ALTER TABLE 表名 DROP FOREIGN KEY 索引名; ALTER TABLE stuinfo DROP FOREIGN KEY fk_majorid_major;
练习
#1.向表emp2的id列中添加 PRIMARY KEY 的约束(my_emp_id_pk) ALTER TABLE emp2 MODIFY id INT PRIMARY KEY; #使用表级约束,取了也没效果主键名固定的 ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id); # 改变 表 表名 添加 【约束 约束名】 主键(列名); #2.向表emp2中添加dept_id,并在其中自定义PRIMARY KEY约束,与之前相关联的列是dept2表中的id列 ALTER TABLE emp2 ADD COLUMN dept_id INT; ALTER TABLE emp2 FOREIGN KEY(dept_id) REFERENCES dept2(id);
今天比昨天晚,却比明天早