MySQL表的约束详解

目录

一、MySQL主键(PRIMARY KEY)

创建表时设置主键约束

创建表时设置联合主键

删除主键约束、修改主键约束

 二、MySQL外键约束(FOREIGN KEY)及唯一约束(UNIQUE)

在创建表时设置外键约束及唯一约束

三、MySQL检查约束(CHECK)

删除检查约束

 四、MySQL查看表中的约束


一、MySQL主键(PRIMARY KEY)

主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。

使用主键应注意以下几点:

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。
  • 一个字段名只能在联合主键字段表中出现一次。
  • 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

创建表时设置主键约束

在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。

create table tt1(
id int(10),
sex enum('男','女')DEFAULT'男',
teacher VARCHAR(5),
PRIMARY KEY(teacher)
);
insert into tt1 (id,teacher)VALUE(202201,'Lucy');
-- 因为主键是teacher 具有唯一性 所以插入不成功
-- insert into tt1 (id,teacher)VALUE(202202,'Lucy');
SELECT * FROM tt1;

创建表时设置联合主键

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。
实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是联合主键了。

注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。

create table tt2(
id int(10),
sex enum('男','女')DEFAULT'男',
teacher VARCHAR(5),
PRIMARY KEY(id,teacher)
);
insert into tt2 (id,teacher)VALUE(202201,'Lucy');
insert into tt2 (id,teacher)VALUE(202202,'Marry');
SELECT * FROM tt2;

删除主键约束、修改主键约束

由于主键约束在一个表中只能有一个,因此不需要指定主键名就可以删除一个表中的主键约束。

通常情况下,当在修改表时要设置表中某个字段的主键约束时,要确保设置成主键约束的字段中值不能够有重复的,并且要保证是非空的。否则,无法设置主键约束。

-- 删除主键 添加主键
alter table tt1 drop primary key;
alter table tt1 add primary key(teacher);
-- -- 有重复数据,将无法增加主键约束

 二、MySQL外键约束(FOREIGN KEY)及唯一约束(UNIQUE)

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。

定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。
唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。

在创建表时设置外键约束及唯一约束

create table work(
id int(10)auto_increment comment'老师编号',
sname varchar(10) not null comment'老师名称',
kname varchar(10) UNIQUE comment'课程',-- 作为被引用的外键,它必须是唯一unique的
primary key(id,kname)
);
insert into work(id,sname,kname)VALUE(1,'Lucy','java');
insert into work(sname,kname)VALUE('Mary','c++');
select * from work;

结果:

--  CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 主表名(主表的主键名)
create table work2(
--  idx 作为外键关联到表work的主键 id
id int auto_increment comment'学生编号',
idx int (10) comment'对应老师编号',
sname varchar(10) not null comment'学生名称',
primary key(id),
CONSTRAINT fk_dept1 FOREIGN KEY (idx) REFERENCES work(id)
);
-- 以上语句执行成功之后,在表 work2 上添加了名称为 fk_dept1 的外键约束,外键名称为  idx ,其依赖于表 work 的主键 id。
insert into work2(id,idx,sname)value(1,1,'张1');
insert into work2(idx,sname)value(1,'张2');
insert into work2(idx,sname)value(2,'张3');
insert into work2(idx,sname)value(2,'张4');
-- insert into work2(idx,sname)value(3,'张5'); 会报错,因为work中依赖的主键只有1,2两个值
select * from work2;

 结果:MySQL表的约束详解_第1张图片

-- 在修改数据表时添加外键约束的语法格式如下:
-- ALTER TABLE 数据表名 ADD CONSTRAINT 外键名FOREIGN KEY(列名) REFERENCES 主表名(列名);
alter table work2 add kcname varchar(10) comment'课程';
alter table work2 add CONSTRAINT fk_dept2 FOREIGN KEY(kcname) REFERENCES work(kname);
-- 插入数据
UPDATE work2 set kcname='java' where id=1;
UPDATE work2 set kcname='java' where id=2;
select * from work2;

 结果:MySQL表的约束详解_第2张图片

三、MySQL检查约束(CHECK)

MySQL 检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。

检查约束使用 CHECK 关键字,具体的语法格式如下:

CHECK <表达式>

删除检查约束

修改表时删除检查约束的语法格式如下:

ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;

 四、MySQL查看表中的约束

查看数据表中的约束语法格式如下:

SHOW CREATE TABLE <数据表名>;

show CREATE table work2;

结果:MySQL表的约束详解_第3张图片

 

 

你可能感兴趣的:(mysql,数据库,database)