MySQL中的约束
Posted 西瓜芒果气泡水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的约束相关的知识,希望对你有一定的参考价值。
目录
一、约束概述
数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
-
主键约束(Primary Key) PK
主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。
主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。
例如,学生信息表中的学号是唯一的。
(非空约束和唯一性约束的复合约束)
-
外键约束(Foreign Key) FK
外键约束经常和主键约束一起使用,用来确保数据的一致性。
-
唯一性约束(Unique)
唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的。
-
非空约束(Not Null)
非空约束用来约束表中的字段不能为空。
-
检查约束(Check)
检查约束也叫用户自定义约束,是用来检查数据表中,字段值是否有效的一个手段,但目前 mysql 数据库不支持检查约束。
二、添加主键约束(Primary Key)
-
单一主键:使用一个列作为主键列,当该列的值有重复时,则违反唯一约束。
-
联合主键:使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束。
1. 修改表添加主键约束
(1)使用DDL语句添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(列名)
示例:将 emp 表中的 employee_id 修改为主键。
alter table emp add primary key(employee_id);
主键自增长(这个功能并不是所有的关系型数据库都有的)
MySQL 中的自动增长类型要求:
- 一个表中只能有一个列为自动增长。
- 自动增长的列的类型必须是整数类型。
- 自动增长只能添加到具备主键约束与唯一性约束的列上。
- 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然 后在删除约束。
alter table 表名 modify 主键 类型 auto_increment;
示例:将 emp 表中的 employee_id 主键修改为自增。
alter table emp modify employee_id int auto_increment;
(2)使用Navicat添加主键约束
三、删除主键
(1)使用DDL语句删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
注意:删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后在删除 主键。
示例:删除emp表中的 employee_id 主键约束。
去掉自动增长:
alter table emp modify employee_id int;
删除主键:
alter table emp drop primary key;
(2)使用Navicat删除主键
三、添加外键约束(Foreign Key)
1. 修改表添加外键约束
(1)使用DDL语句添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY( 列 名 ) REFERENCES 参照的表名(参照的列名);
示例一:创建 departments 表包含 department_id 、department_name ,location_id。
create table departments(department_id int,department_name varchar(30),location_id int);
示例二:修改departments表,向department_id列添加主键约束与自动递增。
alter table departments add primary key(department_id);
alter table departments modify department_id int auto_increment;
示例三:修改emp表,添加dept_id列。
alter table emp add column dept_id int;
示例四:向 emp 表中的 dept_id 列添加外键约束。
alter table emp add constraint emp_fk foreign key(dept_id) references departments(department_id);
(2)使用Navicat添加外键约束
四、删除外键约束
(1)使用DDL语句删除外键约束。
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
示例:删除 dept_id 的外键约束。
alter table emp drop foreign key emp_fk;
(2)使用Navicat删除外键约束
五、添加唯一性约束(Unique)
1. 修改表添加唯一性约束
(1)使用DDL语句添加唯一性约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);
示例:向 emp 表中的 name 添加唯一约束。
alter table emp add constraint emp_uk unique(name);
(2)使用Navicat添加唯一性约束
六、删除唯一性约束
(1)使用DDL语句删除唯一性约束。
ALTER TABLE 表名 DROP KEY 约束名;
示例:删除 name 的唯一约束。
alter table emp drop key emp_uk;
(2)使用Navicat删除唯一性约束。
七、非空约束(Not Null)
1. 修改表添加非空约束
(1)使用DDL语句添加非空约束。
ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;
示例:向 emp 表中的 salary 添加非空约束。
alter table emp modify salary float(8,2) not NULL;
(2)使用Navicat添加非空约束。
八、删除非空约束
(1)使用DDL语句删除非空约束。
ALTER TABLE 表名 MODIFY 列名 类型 NULL;
示例:删除emp表中salary 的非空约束。
alter table emp modify salary float(8,2) NULL;
(2)使用Navicat删除非空约束。
九、创建表时添加约束
查询表中的约束信息:
SHOW KEYS FROM 表名;
示例:创建 depts 表包含 department_id 该列为主键且自动增长,department_name 列不 允许重复,location_id 列不允含有空值。
create table depts(department_id int primary key auto_increment,department_name varchar(30) unique,location_id int not null);
MySQL中的唯一约束
【中文标题】MySQL中的唯一约束【英文标题】:Unique constraint in MySQL 【发布时间】:2010-11-16 02:18:58 【问题描述】:默认情况下,唯一约束是索引吗?如果不是,在SELECT ... WHERE
子句中使用唯一约束时,它是否具有与索引列相同的性能结果?
谢谢
【问题讨论】:
【参考方案1】:在开始使用唯一约束之前检查主键约束。
主键约束相当于声明一个唯一约束和一个非空约束。如果主键中有多个列,则每一列都有一个非空约束,但唯一约束适用于所有列。
当您声明主键时,DBMS 将为您创建一个索引。如果您愿意,您可以删除索引,但是当 DBMS 进行表扫描以检查唯一性时,您将获得糟糕的性能。
主键约束强制实体完整性,而 REFERENCES(外键)约束强制参照完整性。它们一起在确保数据完整性方面大有帮助。
【讨论】:
【参考方案2】:UNIQUE 实际上是 on 一个索引的约束,所以是的,UNIQUE 意味着在您强制唯一性的字段上有一个索引。
【讨论】:
所以现在我又困惑了,我应该在我的创建表中放入以下内容:唯一(电子邮件)还是:唯一索引(电子邮件)?【参考方案3】:唯一性约束是一种表达某事物(如属性值的某种组合)在整个关系(“表”)范围内必须是唯一的事实的方式。
这是在逻辑设计级别。
索引是帮助强制执行此类约束的一种可能有用的方法。
这是在物理设计级别。
某些 DBMS 产品可能会根据某些逻辑设计构造(例如 UNIQUE 约束)的存在来推断某些物理设计构造(例如某些索引的存在)。其他人可能不会。
【讨论】:
【参考方案4】:唯一约束必然是索引。您通常将其定义为“唯一索引”。在任何情况下都需要一个索引来有效地实现唯一约束,因此拥有一个索引并不是缺点。
【讨论】:
【参考方案5】:约束实际上与索引非常不同:它只是说 MySQL 应该为您强制执行唯一性。然而,索引(尽管它可以是唯一的)与硬盘上的物理顺序有关,或者与允许在列上有效搜索的其他结构(通常是树)有关。
但是,您可能会将所有这些与定义(通常是聚集的)唯一索引的主键混淆。
【讨论】:
所以可以说在我的表中我有一列“email”,我做了几次查询“select * from tbl where email like 'something'”。此列是唯一列,但它不是主键。那么我索引它会更好的性能吗? @Kai:是的,索引会在读取数据时提高性能(写入数据可能会受到阻碍)。唯一约束仅意味着对于表中的所有行,为其定义了唯一约束的列中的值将是唯一的 - 没有两个电子邮件列的值会相同。以上是关于MySQL中的约束的主要内容,如果未能解决你的问题,请参考以下文章