MySql约束
Content
概念:
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
- 主键约束:primary key
- 非空约束:not null
- 唯一约束:unique
- 外键约束:foreign key
(一)非空约束:not null
SELECT DATABASE(); -- 查看当前的数据库
-- 1.创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
-- 2.创建表完了之后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
-- 3.删除name的非空约束
ALTER TABLE stu MODIFY NAME VARBINARY(20);
SELECT * FROM stu;
(二)唯一约束:unique
DROP TABLE stu; -- 删掉,重新建表
-- 1.在建表时添加:唯一约束
CREATE TABLE stu(
id INT,
phone VARCHAR(20) UNIQUE -- 添加唯一约束,法一
);
-- 2.在建表完后,添加唯一约束:
ALTER TABLE stu MODIFY phone VARCHAR(20) UNIQUE; -- 此时也可以添加约束唯一,法二
-- 3.删除唯一约束:(注意:和删除非空约束的方法不同)
ALTER TABLE stu DROP INDEX phone ;
(三)主键约束:表中各记录的唯一标识,必须非空
-- 1.创建表时,添加主键约束
CREATE TABLE stu(
id INT PRIMARY KEY, -- 给id添加主键约束:
NAME VARCHAR(20)
);
-- 2.创建表之后,再添加主键约束
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-- 3.删除主键约束:[方法比较特殊]
ALTER TABLE stu DROP PRIMARY KEY;
(四)外键约束
(1)单表的缺点:数据冗余
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30), age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
);
-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');
SELECT * FROM emp; -- 此表数据较为冗余
(2)解决办法:拆分成两个表
1.从表中,使用外键关联主表中的主键
2.级联操作,在修改和更新主表的主键时,同时更新或删除从表的外键值
-- 1.创建主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 添加2个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
SELECT * FROM department;
-- 2. 创建员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT , -- 外键对应主表的主键
-- 创建外键约束
CONSTRAINT emp_depid_fk FOREIGN KEY (dep_id) REFERENCES department(id) -- 外键约束:只能出现与主表中一致的主键id
ON UPDATE CASCADE ON DELETE CASCADE -- 级联操作,在修改和更新主表的主键时,同时更新或删除附表的外键值
)
-- 添加员工,dep_id表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);