约束和级联

/*
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;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值