#常见约束
/*
六大约束
NOT NULL :非空
DEFAULT :默认 保证该字段有默认值
PRIMARY KEY :主键 保证该字段有唯一性且非空
UNIQUE : 保证唯一但可以为空
CHECK :检查约束(MySQL中不支持)限制该字段的值在一个范围
FOREIGN KEY :外键 从表中添加外键约束,引用主表中某列的值
语法:列名 类型 ,【constraint 约束名】 foreign key(majorId) references major(id);
添加约束的时机
1、创建表时
2、修改表时
分类
列级约束:
六大约束语法上都支持,但是外键约束没有效果
表级约束:
除了非空和默认,其他都支持
*/
#一、创建表时添加约束
CREATE DATABASE students;
USE students;
#1、添加列级约束
CREATE TABLE stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender='男' OR gender='女'),#不支持
seat INT UNIQUE,
age INT DEFAULT 18,
majorId INT ,FOREIGN KEY(majorId) REFERENCES major(id)
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
#2、添加表级约束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorId INT,
CONSTRAINT pk PRIMARY KEY(id),
CONSTRAINT un UNIQUE(seat),
CONSTRAINT fk CHECK(gender='男' OR gender='女'),
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES `major`(id)
#constraint和约束名可以省略
);
SHOW INDEX FROM stuinfo;
#通用写法:外键约束用表级约束,其他用列级约束
#主键和唯一的区别!!!!!!!!面试题
/* 是否保证唯一 是否允许为空 一个表中有几个 是否允许组合
主键 是 否 <=1 是,但不推荐
唯一 是 是 任意 是,但不推荐
主键组合
primary key(id,stuname)二者共同充当主键
如
insert into students values (1,'john',...)
insert into students values (2,'john',...)
insert into students values(1,'john',...)
insert into students values(1,'lily',...)
上面两组皆可插入成功
insert into students values(1,'john',...)
insert into students values(1,'john',...)
这组不行
*/
#外键的特点!!!
/*
1、要求再从表设置外键关系
2、从表外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3、要求主表的关联列必须是一个key(一般是主键,或者唯一键,主键居多)
4、要求插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,在删除主表
*/
#修改表时添加约束
#1、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#2、添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#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 stuindo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);#可省略constraint
#修改表时删除约束
#1、删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2、删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3、删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4、删除唯一
ALTER TABLE stuinfo DROP INDEX seat;#seat为key name
SHOW INDEX FROM stuinfo;#先查看key name
#5、删除外键
ALTER TABLE stuinto DROP FOREIGN KEY fk_stuinfo_major;#fk_stuinfo_major为key name