/*
NOT NULL 非空约束,规定某个字段不能为空
UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
PRIMARY KEY 主键(非空且唯一)
FOREIGN KEY 外键
CHECK 检查约束 (mysql不支持)
DEFAULT 默认值
约束的分类 :列级约束 vs 表级约束
列级约束:同时只能约束一列
表级约束:可以同时约束多列
添加约束:创建表时添加约束(了解) vs 创建表后添加约束(知道就可以)
注意:not null和default只有列级约束(check-但是mysql不支持)
*/
#创建表时添加列级约束
CREATE TABLE s1(
id INT PRIMARY KEY,#主键
NAME VARCHAR(20) NOT NULL,#非空约束
sid INT UNIQUE,#唯一约束
age INT DEFAULT 18 #默认值
);
DESC s1;
INSERT INTO s1(id,NAME,sid,age) VALUES(1,'a',1001,18);
INSERT INTO s1(id,NAME,sid,age) VALUES(2,'b',1002,18);
INSERT INTO s1(id,NAME,sid,age) VALUES(3,'c',1003,18);
INSERT INTO s1(id,NAME,sid,age) VALUES(4,'d',1004,18);
INSERT INTO s1(id,NAME,sid) VALUES(5,'e',1005);
#创建表时添加表级约束
CREATE TABLE s2(
id INT,
sid INT,
NAME VARCHAR(20),#最后一个字段要加","因为下面有内容
#CONSTRAINT 索引名 PRIMARY KEY(字段名1,字段名2,.....)
CONSTRAINT s2_id_sid PRIMARY KEY(id,sid)
);
DESC s2;
INSERT INTO s2(id,sid,NAME) VALUES(1,1001,'a');
INSERT INTO s2(id,sid,NAME) VALUES(1,1002,'a');
INSERT INTO s2(id,sid,NAME) VALUES(2,1002,'a');
CREATE TABLE s3(
id INT,
sid INT,
NAME VARCHAR(20),#最后一个字段要加","因为下面有内容
#CONSTRAINT 索引名 unique(字段名1,字段名2,.....)
CONSTRAINT s3_id_sid UNIQUE(id,sid)
);
DESC s3;
INSERT INTO s3(id,sid,NAME) VALUES(1,1001,'a');
INSERT INTO s3(id,sid,NAME) VALUES(1,1002,'a');
INSERT INTO s3(id,sid,NAME) VALUES(2,1002,'a');
#创建表后添加约束
CREATE DATABASE db5;
CREATE TABLE s1(
id INT,
NAME VARCHAR(20),
sid INT,
age INT
);
/*
primary key
添加约束 : alter table 表名 add primary key (字段名)
修改约束 : alter table 表名 modify 字段名 类型 primary key
删除约束 : alter table 表名 drop primary key
*/
ALTER TABLE s1 ADD PRIMARY KEY(id);
ALTER TABLE s1 DROP PRIMARY KEY;
ALTER TABLE s1 MODIFY id INT PRIMARY KEY;
/*
unique:
添加约束 : alter table 表名 add unique(字段名)
添加约束 : alter table 表名 add constraint 索引名 unique(字段名)
修改约束 :alter table 表名 modify 字段名 类型 unique
删除约束 :alter table 表名 drop index 索引名
*/
ALTER TABLE s1 ADD UNIQUE(sid);
ALTER TABLE s1 DROP INDEX sid;#默认索引名和字段名相同
ALTER TABLE s1 MODIFY age INT UNIQUE;
ALTER TABLE s1 ADD CONSTRAINT s1_id_sid UNIQUE(id,sid);
DESC s1;
/*
外键约束:
1.先创建主表还是从表?主表
2.插入数据先往主表还是从表? 主表
3.删除数据先删除主表还是从表?从表
*/
/*
部门表 :主表
*/
CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
/*
员工表 :从表
*/
CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
#CONSTRAINT 索引名 FOREIGN KEY(员工表的字段名) REFERENCES 部门表(部门表的字段名)
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);
INSERT INTO dept(dept_id,dept_name) VALUES(10,'HR')
INSERT INTO emp(last_name,dept_id) VALUES('aaa',10);
DELETE FROM emp WHERE dept_id=10;
DELETE FROM dept WHERE dept_id=10;
###############################################################
CREATE DATABASE db7;
#级联删除
CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
#ON DELETE CASCADE :级联删除(删除部门时部门的员工全部删除掉)
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id) ON DELETE CASCADE
);
DELETE FROM dept WHERE dept_id=10;
约束和级联
最新推荐文章于 2024-09-15 19:46:31 发布