MySQL的约束分为 主键primary key,非空not null,默认default, 唯一unique, 外键foreign key, 检查check
目录
一、主键 primary key
1.主键的定义有两种
2.一张表最多只能有一个主键,但可以符合主键
3.主键列的值是不可以重复的,且不能为null
二、非空 not null? ? ?默认 default
1.非空约束,用于约束该字段的值不能为null
2.默认约束,插入字段值的时候,若没有插入值则使用默认值
三、唯一 unique
1.当定义了unique约束后,该字段的值是不能重复的
2.如果该字段指定了unique却没有指定not null,则该unique字段中可以有多个null值
3.一张表可以使用多个unique约束
四、外键 foreign key
1.外键指向表的字段,要求该字段是 主键primary key 或者是 unique唯一的
2.外键是【从表】的字段指向【主表】的主键或唯一unique
3.表的类型是innodb,这样的表才支持外键
4.外键字段类型要和主键字段类型一致,长度可以不一致
5.【从表】的外键字段的值,必须要在【主表】的主键字段中出现过,或者为null【前提是【从表】的外键字段允许为null】
6.一旦建立了外键关系,就不可以随意删除数据
五、检查 check
1.MySQL5.7目前还不支持check,只支持语法的校验,但不会生效
2.学习oracle, SQL Server,这俩个数据库是真的可以生效
一、主键 primary key
1.主键的定义有两种
????????1) 直接在字段后指定:字段名?primary key
CREATE TABLE t1(
id INT PRIMARY KEY,
`name` VARCHAR(32));
????????2) 在表的定义之后写primary key (列名);
CREATE TABLE t2(
id INT,
`name` VARCHAR(32),
PRIMARY KEY (`name`));
2.一张表最多只能有一个主键,但可以符合主键
CREATE TABLE t3(
id INT,
`name` VARCHAR(32),
PRIMARY KEY(id, `name`)); -- 这里就是复合主键
3.主键列的值是不可以重复的,且不能为null
INSERT INTO t1
VALUES(null, 'tom'); -- false
二、非空 not null? ? ?默认 default
1.非空约束,用于约束该字段的值不能为null
2.默认约束,插入字段值的时候,若没有插入值则使用默认值
create table t4(
id int primary key,
'name' varchar(32) not null default '');
# 表示name字段不可以为空,可配合default(默认)使用
# 默认为空字符串
三、唯一 unique
1.当定义了unique约束后,该字段的值是不能重复的
2.如果该字段指定了unique却没有指定not null,则该unique字段中可以有多个null值
? ? ? ? 【如果该字段同时使用了unique 和not null 字段,使用效果就像主键 primary key】
3.一张表可以使用多个unique约束
四、外键 foreign key
1.外键指向表的字段,要求该字段是 主键primary key 或者是 unique唯一的
2.外键是【从表】的字段指向【主表】的主键或唯一unique
3.表的类型是innodb,这样的表才支持外键
4.外键字段类型要和主键字段类型一致,长度可以不一致
5.【从表】的外键字段的值,必须要在【主表】的主键字段中出现过,或者为null【前提是【从表】的外键字段允许为null】
6.一旦建立了外键关系,就不可以随意删除数据
# 创建主表
CREATE TABLE first_table(
id INT PRIMARY KEY, -- 假定该id当作部门编号
`name` VARCHAR(32) NOT NULL DEFAULT '');
# 创建从表
CREATE TABLE second_table(
id INT PRIMARY KEY, -- 假定该id为员工编号
`name` VARCHAR(32) NOT NULL DEFAULT '',
dept_id INT, -- 员工所在部门的编号
-- 下面指定外键关系
FOREIGN KEY (dept_id) REFERENCES first_table(id));
# foreign key 外键
# dept_id 【从表】字段
# refernces 参考文献
# first_table【主表】
# id 主表字段
# 测试数据
INSERT INTO first_table
VALUES(100, '研发部'), (200, '宣传部');
SELECT * FROM first_table;
INSERT INTO second_table
VALUES(1, 'tom', 100), (2, 'jack', 200);-- 可以成功
INSERT INTO second_table
VALUES((3, 'marry', 300));-- 这里会失败,因为300部门不存在
INSERT INTO second_table
VALUES(4, 'king', NULL); -- 这里会成功,因为外键字段没有设置not null约束
SELECT * FROM second_table;
五、检查 check
1.MySQL5.7目前还不支持check,只支持语法的校验,但不会生效
CREATE TABLE t5(
id INT PRIMARY KEY,
`name` VARCHAR(32),
sex VARCHAR(6) CHECK (sex IN('man','woman')),-- 设定性别为男或者女
sal DOUBLE CHECK (sal > 1000 AND sal < 2000));-- 设定薪资为1000到2000
-- 添加数据
INSERT INTO t5
VALUES(1, 'tom', 'abc', 1);
SELECT * FROM t5; -- 是真的进去了
2.学习oracle, SQL Server,这俩个数据库是真的可以生效
|