目录
一、MySQL主键(PRIMARY KEY)
创建表时设置主键约束
创建表时设置联合主键
删除主键约束、修改主键约束
二、MySQL外键约束(FOREIGN KEY)及唯一约束(UNIQUE)
在创建表时设置外键约束及唯一约束
三、MySQL检查约束(CHECK)
删除检查约束
四、MySQL查看表中的约束
主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。
使用主键应注意以下几点:
在 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)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 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;
-- 在修改数据表时添加外键约束的语法格式如下:
-- 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 检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。
检查约束使用 CHECK 关键字,具体的语法格式如下:
CHECK <表达式>
修改表时删除检查约束的语法格式如下:
ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;
查看数据表中的约束语法格式如下:
SHOW CREATE TABLE <数据表名>;
show CREATE table work2;