在 SQL 中,约束是规定表中的数据规则。若存在违反约束的行为,行为就会被阻止。它能帮助管理员更好地管理数据库,并且确保数据库中数据的正确性和有效性。例如在后台的数据库设计中对要输入的数据进行核查或判断,再决定是否写入数据库,这都是约束的应用。
NOT NULL 约束强制列不接受 NULL 值,强制字段始终包含值,这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
例子:
先创建一个表 SQL 强制 ID
列、 LastName
列以及 FirstName
列不接受 NULL 值:
create table Person
(
ID int not null,
LastName varchar(50) not null,
FirstName varchar(50) not null,
Age int
);
示例代码:
在一个已创建的表的 Age
字段中添加 NOT NULL 约束如下所示:
alter table Person
modify Age int not null;
在一个已创建的表的 Age
字段中删除 NOT NULL 约束如下所示:
alter table Person
modify Age int null;
不要把 NULL 值与空串相混淆。NULL 值是没有值,
它不是空串。如果指定' '(两个单引号,其间没有字符),这
在 NOT NULL 列中是允许的。空串是一个有效的值,它不是无
值。NULL 值用关键字 NULL 而不是空串指定。
在前面的学习中我们知道了 NOT NULL 约束是强制列不接受 NULL 值,在有些情况下,我们不希望一个表中出现重复的记录,这时候我们需要用到 UNIQUE 约束来解决这些问题。
UNIQUE 约束唯一标识数据库表中的每条记录;
UNIQUE 和主键约束均为列或列集合提供了唯一性的保证;
主键约束会自动定义一个 UNIQUE 约束,或者说主键约束是一种特殊的 UNIQUE 约束。但是二者有明显的区别:每个表可以有多个 UNIQUE 约束,但只能有一个主键约束。
SQL 在 Persons
表创建时在 P_Id
列上创建 UNIQUE 约束:
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 约束:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraint uc_PersonID unique(P_Id,LastName)
)
当表已被创建时,在 P_Id
列创建 UNIQUE 约束:
alter table Person
add unique(P_Id);
当表已被创建时,需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:
alter table Person
add constraint uc_PersonID unique (P_Id,LastName);
alter table Person
drop constraint uc_PersonID;
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 只是为了保证域/域组的唯一性。
前面我们创建了个人信息数据表 Persons
,我们希望每个人的标识符 P_Id
都是唯一的。
下面的 SQL 在 个人信息表 Persons
创建时,在 P_Id
列上添加 PRIMARY KEY 约束:
CREATE TABLE Persons
(
P_Id int NOT NULL primary key,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
上述语句中 NOT NULL 为非空约束,即输入值必须不为空否则会报错。
如需命名并定义多个列的 PRIMARY KEY 约束,语法:
CREATE TABLE Persons
(
P_Id int NOT NULL primary key,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraint uc_PersonID primary key(P_Id,LastName)
)
注释:
在上面的实例中,只有一个主键 PRIMARY KEY(pk_PersonID)。然而,pk_PersonID 的值是由两个列(P_Id
和LastName
)组成的。
执行输出结果:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | PRI | NULL | |
| LastName | varchar(255) | NO | | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
如果我们在创建 Persons
时没有指定创建主键约束,此时是否需要删除表再重新写带有主键约束的建表语句呢?这里我们可以使用 ALTER TABLE 语句在创建表后添加主键约束。
当表已被创建时,如需在 P_Id
列创建 PRIMARY KEY 约束:
alter table Person
add primary key (P_Id);
执行输出结果:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | PRI | NULL | |
| LastName | varchar(255) | NO | | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
如需命名并定义多个列的 PRIMARY KEY 约束,可以使用下面的 SQL 语法:
alter table Person
add constrain pk_PersonID primary key('P_Id','LastName');
注释:
如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
执行输出结果:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | PRI | NULL | |
| LastName | varchar(255) | NO | PRI | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY 。
外键最根本的作用:保证数据的完整性和一致性。
就这么说吧,学生表和院系表,这里的院系就是学生表的外键,外键表是学生表,主键表是院系表。现在,院系表中的某个院系被你删除了,而你又想在学生表中要想查询这个被删除的院系号所对应的院信息,但是执行之后报错了。
为什么?
因为学生表当中的院系是外键,是联接着院系表当中的院系,而且,院系表当中的院系还是它本身这个表的主键,这两个表的数据信息是连着的,你删除其中一个表中的外键,另一个表中的主键都没有删除,查询执行之后当然会报错啦。学生表中已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表。
这就是外键的作用,外键可以保持数据的一致性、完整性。
外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。
在 "Orders" 表创建时在 "P_Id" 列上创建 FOREIGN KEY 约束:
create table Orders
(
O_Id int not null,
OrderNo int not null,
P_Id int,
primary key(O_Id),
foreign key(P_Id) references Persons(P_Id)
);
其中
NOT NULL 表示该字段不为空
REFERENCES 表示 引用一个表
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
create table Order
(
O_Id int not null,
OrderNo int not null,
P_Id int,
primary key(O_Id),
constraint fk_PerOrders foreign key (P_Id)
references Persons(P_Id)
);
其中
CONSTRAINT 表示约束,后面接约束名称,常用于创建约束和删除约束;
当 "Orders" 表已被创建时,如需在 "P_Id" 列创建 FOREIGN KEY 约束:
alter table Orders
add foreign key (P_Id)
references Persons(P_Id)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
alter table Orders
add constraint fk_PerOrders
foreign key(P_Id)
references Persons(P_Id)
删除 FOREIGN KEY 约束:
alter table Order
drop foreign key;--MySQL
drop constraint key fk_PerOrders;--SQL Sever