1、约束
1.1 约束
在 SQL 中,约束是规定表中的数据规则。若存在违反约束的行为,行为就会被阻止。它能帮助管理员更好地管理数据库,并且确保数据库中数据的正确性和有效性。例如在后台的数据库设计中对要输入的数据进行核查或判断,再决定是否写入数据库,这都是约束的应用。
1.1、非空约束NOT NULL
NOT NULL 约束强制列不接受 NULL 值,强制字段始终包含值,这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
下面的 SQL 强制 ID 列、 LastName 列以及 FirstName 列不接受 NULL 值:
CREATE TABLE `Persons` (
`ID` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255) NOT NULL,
`Age` int
);
在一个已创建的表的 Age 字段中添加 NOT NULL 约束如下所示:
ALTER TABLE `Persons`
MODIFY `Age` int NOT NULL;
在一个已创建的表的 Age 字段中删除 NOT NULL 约束如下所示:
ALTER TABLE `Persons`
MODIFY `Age` int NULL;
注意
不要把 NULL 值与空串相混淆。NULL 值是没有值,
它不是空串。如果指定' '(两个单引号,其间没有字符),这
在 NOT NULL 列中是允许的。空串是一个有效的值,它不是无
值。NULL 值用关键字 NULL 而不是空串指定。
1.2唯一约束UNIQUE
在前面的学习中我们知道了 NOT NULL 约束是强制列不接受 NULL 值。
在有些情况下,我们不希望一个表中出现重复的记录,这时候我们需要用到 UNIQUE 约束来解决这些问题。
- UNIQUE约束唯一标识数据库表中的每条记录
- UNIQUE 和 主键约束均为列或列集合提供了唯一性的保证
- 主键约束会自动定义一个UNIQUE约束,或者说主键约束是一种特殊的UNIQUE约束。但是二者有明显的区别:每个表可以有多个UNIQUE约束,但是只能有一个主键约束。
1.2.1CREATE TABLE 时的 UNIQUE 约束
MySQL
CREATE TABLE `Persons`
(
`P_Id` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255),
`Address` varchar(255),
`City` varchar(255),
UNIQUE (`P_Id`)
)
SQL Server | Oracle | MS Access
CREATE TABLE `Persons`
(
`P_Id` int NOT NULL UNIQUE,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255),
`Address` varchar(255),
`City` varchar(255)
)
命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:
MySQL / SQL Server / Oracle / MS Access
CREATE TABLE `Persons`
(
`P_Id` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255),
`Address` varchar(255),
`City` varchar(255),
CONSTRAINT uc_PersonID UNIQUE (`P_Id`,`LastName`)
)
1.2.2 ALTER TABLE 时的 UNIQUE 约束
当表已被创建时,在P_id列创建UNIQUE约束:
MySQL / SQL Server / Oracle / MS Access
ALTER TABLE `Persons`
ADD UNIQUE (`P_Id`)
当表已被创建时,需命名UNIQUE约束,并定义多个列的UNIQUE约束:
MySQL / SQL Server / Oracle / MS Access
ALTER TABLE `Persons`
ADD CONSTRAINT uc_PersonID UNIQUE (`P_Id`,`LastName`)
1.2.3撤销UNIQUE约束
如需撤销 UNIQUE 约束 :
MySQL
ALTER TABLE `Persons`
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access
ALTER TABLE `Persons`
DROP CONSTRAINT uc_PersonID
1.3主键约束PRIMARY KEY
PRIMARY KEY 约束唯一标识数据库表中的每条记录 ,简单的说,PRIMARY KEY = UNIQUE + NOT NULL ,从技术的角度来看,PRIMARY KEY 和 UNIQUE 有很多相似之处。但还是有以下区别:
NOT NULL UNIQUE 可以将表的一列或多列定义为唯一性属性,而 PRIMARY KEY 设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复。
PRIMARY KEY 可以与外键配合,从而形成主从表的关系,而 NOT NULL UNIQUE 则做不到这一点
如:
表一:用户id(主键),用户名
表二:银行卡号id(主键),用户id(外键)
则表一为主表,表二为从表
- 更大的区别在逻辑设计上。
PRIMARY KEY 一般在逻辑设计中用作记录标识,这也是设置 PRIMARY KEY 的本来用意,而 UNIQUE 只是为了保证域/域组的唯一性。