六大约束
1.NOT NULL : 非空
2.DEFAULT: 默认值
3.PRIMARY KEY:主键
4.UNIQUE:保证唯一性,可以为空
5.CHECK:检查约束 [mysql中不支持]
6.FOREIGN KEY: 外键约束,用于保证该字段的值必须来自于主表关联列的值。
添加约束的时机:(数据添加之前)
1.创建表时
2.修改表时
CREATE TABLE 表名(
字段名 字段类型 列级约束 #外键约束无效果
字段名 字段类型
表级约束 #非空、默认无效
)
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 REFERENCES major(id) #外键
#或者:
#CONSTRAINT pk PRIMARY KEY(id), #不起名不需要CONSTRAINT
#CONSTRAINT ug UNIQUE(seat),
#CONSTRAINT ck CHECK(gender='男' OR gender = '女'),
CONSTRAINT fk_stuinfo_major FOREIGN KEY(major) REFERENCES major(id) #外键
)
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
#联合主键 / 联合唯一 -不推荐
PRIMARY KEY(id,name),# id name 都不能重复
#修改表时添加约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL
#添加主键
#1.列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#2.表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#外键
ALTER TABLE stuinfo ADD FOREIGN KEY(major) REFERENCES major(id);
#删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#****删除主键****
ALTER TABLE stuinfo DROP PRIMARY KEY;
#****删除唯一****
ALTER TABLE stuinfo DROP INDEX seat;
#****删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY majorid(或别名);
SHOW INDEX FROM stuinfo
PRIMARY 与UNIQUE 对比
1.都保证了唯一性,
2.都可以组合(联合)
3.但主键不能为 NULL,UNIQUE 可以,但也只能有一个NULL。
4.主键只能有一个,UNIQUE则不一样
外键
1.要求在从表设置外键关系
2.主表从表关联列的类型要求一致或兼容,名称无要求
3.主表关联列必须是一个KEY
4.插入数据先插入主表在插入从表,删除则反之
自增长列
1.标识列不一定和主键搭配
如 (2.每个表至多一个)
3.标识列只能是数值型
4.可以设置步长,从插入值处开始增长
CREATE TABLE major(
id INT UNIQUE AUTO_INCREMENT,
majorName VARCHAR(20)
);
删除主表记录
DELETE FROM major WHERE id=2;
1.级联删除
添加外键时追加ON子句
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE
2.级连置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL