约束用于限制加入表的数据类型
新增表时创建约束
eg:
DROP TABLE if EXISTS person;
CREATE TABLE person
(
id INT AUTO_INCREMENT COMMENT 'id',
lastname VARCHAR(20) COMMENT '姓名',
sex VARCHAR(255) not NULL COMMENT '性别',
city VARCHAR(255) DEFAULT '中国' COMMENT '地区',
age INT COMMENT '年龄',
UNIQUE (lastname),
PRIMARY KEY (id)
)
效果:
涉及语句:
语句关键字 | 作用 |
---|---|
CREATE TABLE person | 建表,person为表名称 |
DROP TABLE if EXISTS person; | 如果表存在就删除 |
INSERT INTO person (id,lastname,sex,city,age) VALUES (1,'liming','男','石家庄',18) | 给表中插入一条数据 |
COMMENT | 字段描述说明 |
– | – |
not NULL | 非空约束,见sex那个字段。当插入字段内容为NULL 时报错 |
DEFAULT | 默认值约束,当没有给当前字段传值时,取默认值。字段city |
PRIMARY KEY (id) | 主键约束,,就使得该字段不重复且不为空;见字段id |
AUTO_INCREMENT | 自动增长,一般和主键约束一起使用。插入数据时,字段自动比上一条数据加1 |
UNIQUE | 唯一约束,重复的值不能插入,见字段lastname |
FOREIGN key | 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY |
验证约束:
-- 正常的插入一条数据
INSERT INTO person (id,lastname,sex,city,age) VALUES (1,'liming','男','石家庄',18)
-- 验证主键约束(PRIMARY KEY)不可重复 报错:1062 - Duplicate entry '1' for key 'PRIMARY'
INSERT INTO person (id,lastname,sex,city,age) VALUES (1,'张三','男','石家庄',18)
-- 验证唯一约束(UNIQUE) 报错:1062 - Duplicate entry 'liming' for key 'lastname'
INSERT INTO person (id,lastname,sex,city,age) VALUES (2,'liming','男','石家庄',18)
-- 验证非空约束(not NUL) --没有值不是NULL
INSERT INTO person (id,lastname,city,age) VALUES (2,'Jenny','石家庄',18)
-- 验证非空约束(not NUL) 报错: 1048 - Column 'sex' cannot be null
INSERT INTO person (id,lastname,sex,city,age) VALUES (3,'zhangsan',NULL,'石家庄',18)
-- 验证默认约束(DEFAULT) 将该字段赋值为默认值
INSERT INTO person (id,lastname,sex,age) VALUES (3,'zhangsan','男',18)
-- 插入数据,验证自动增长(AUTO_INCREMENT)
INSERT INTO person (lastname,sex,city,age) VALUES ('liming','男','石家庄',18)
INSERT INTO person (lastname,sex,city,age) VALUES ('zhangsan','男','石家庄',18)
INSERT INTO person (id,lastname,sex,city,age) VALUES (5,'lisi','男','石家庄',18)
INSERT INTO person (lastname,sex,city,age) VALUES ('jenny','男','石家庄',18)
#创建FOREIGN KEY约束
DROP TABLE if EXISTS person_info;
CREATE TABLE person_info
(
id INT COMMENT 'ID',
company VARCHAR(255) COMMENT '公司',
phone CHAR(11) COMMENT '电话',
id_person int,
FOREIGN key (id_person) REFERENCES person(id)
)
-- 正常插入
INSERT INTO person_info (id,company,phone,id_person) VALUES (1,'华润','170903232493',1)
-- 插入一条person表中id不存在的值
-- 报错: 1452 - Cannot add or update a child row: a foreign key constraint fails (`zaj-menu-dcms`.`person_info`, CONSTRAINT `person_info_ibfk_1` FOREIGN KEY (`id_person`) REFERENCES `person` (`id`))
INSERT INTO person_info (id,company,phone,id_person) VALUES (1,'华润','170903232493',18)
#验证定长字段--char.意思是在内存中占有固定长度的空间,当字符长度小于固定长度时,补0到固定长度;当字符长度大于固定长度时,多出的部分将被截断
INSERT INTO person_info (id,company,phone,id_person) VALUES (3,'华润','1234567890123',2)
INSERT INTO person_info (id,company,phone,id_person) VALUES (1,'华润','11',1)
#VARCHAR-存储变长数据,VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度
修改及删除约束
涉及命令
语句关键字 | 作用 | 语法 |
---|---|---|
alter | 更新表结果 | |
change | 可以更改列名 和 列类型 (每次都要把新列名和旧列名写上, 即使两个列名没有更改,只是改了类型) | alter table 表名 change 旧列名 新列名 类型 |
modify | 可以更改列的属性 | alter table 表名 MODIFY 列名 类型 |
not null 约束
-- 更新表时添加约束(not null)【change和modify是两种方法,desc是用来验证修改结果的】
ALTER TABLE person_info CHANGE company company VARCHAR(20) not null;
ALTER TABLE person_info MODIFY company VARCHAR(20) not null ;
DESC person_info;
-- 删除约束(not null)
ALTER TABLE person_info CHANGE company company VARCHAR(20) ;
ALTER TABLE person_info MODIFY company VARCHAR(20) ;
DESC person_info;
UNIQUE约束
更新表时添加约束(UNIQUE,PRIMARY KEY,FOREIGN KEY)
-- 更新表时添加约束(UNIQUE),没有设定名字时约束名为列名称
ALTER TABLE person_info ADD UNIQUE(phone);
-- 给约束起名字,删除时用该名字删除
ALTER TABLE person_info ADD CONSTRAINT phone_name UNIQUE(phone);
desc person_info;
-- 更新表时添加约束(PRIMARY KEY)
ALTER TABLE person_info ADD PRIMARY KEY(id);
ALTER TABLE person_info ADD CONSTRAINT id_name PRIMARY KEY(id);
desc person_info;
-- 更新表时添加约束(FOREIGN KEY),没有设置名字时自动生成一个名字
ALTER TABLE person_info ADD FOREIGN KEY (id_person) REFERENCES person(id) ;
-- 给约束起名字,删除时用该名字删除
ALTER TABLE person_info ADD CONSTRAINT id_name FOREIGN KEY (id_person) REFERENCES person(id);
-- 查看建表脚本
show CREATE TABLE person_info;
删除约束(UNIQUE,PRIMARY KEY,FOREIGN KEY)
-- 删除约束(UNIQUE),使用约束名称删除
ALTER TABLE person_info DROP INDEX phone;
ALTER TABLE person_info DROP INDEX phone_name;
desc person_info;
-- 删除约束(PRIMARY KEY)
ALTER TABLE person_info DROP PRIMARY KEY;
desc person_info;
-- 删除约束(FOREIGN KEY),使用约束名称删除
ALTER TABLE person_info DROP FOREIGN KEY person_info_ibfk_1;
show CREATE TABLE person_info;
default 约束
更新表时添加约束(default)
-- 更新表时添加约束(defalut)
ALTER TABLE person_info ALTER company SET DEFAULT '永辉';
DESC person_info;
删除约束(default)
-- 删除约束(defalut)
ALTER TABLE person_info ALTER company DROP DEFAULT ;
DESC person_info;
参考链接:
https://www.jianshu.com/p/e9338da60a61
https://www.jianshu.com/p/e6a2825c1154