1.什么是SQL约束?
SQL约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。约束可以在创建表时规定(通过CREATE TABLE语句),或者在表创建之后规定(通过ALTER TABLE语句)。
SQL的CREATE TABLE+CONSTRAINT语法。
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
在SQL中,我们有如下约束:
NOT NULL:指示某列不能存储NULL值。
UNIQUE:保证某列的每行必须有唯一的值。
PRIMARY KEY:NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK:保证列中的值符合指定的条件。
DEFAULT:规定没有给列赋值时的默认值。
2.NOT NULL约束
在默认的情况下,表的列接受NULL值。NOT NULL约束强制列不接受NULL值。NOT NULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
NOT NULL约束的示例:
执行如下SQL语句,在创建表Persons时强制ID列、LastName列和FirstName列不接受NULL值。
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
添加NOT NULL约束的示例。
执行如下SQL语句,在一个已创建的Persons表的Age字段中添加NOT NULL约束。
ALTER TABLE Persons
MODIFY Age int NOT NULL;
删除NOT NULL约束的示例。
执行如下SQL语句,在一个已创建的Persons表的Age字段中删除NOT NULL约束。
ALTER TABLE Persons
MODIFY Age int NULL;
DROP TABLE Persons;
3.UNIQUE约束
UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARY KEY约束均为列或列集合提供了唯一性的保证。PRIMARY KEY约束拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。
UNIQUE和PRIMARY KEY的区别:
UNIQUE(唯一约束)和PRIMARY KEY(主键)非常相似,但是UNIQUE允许字段中出现一次NULL值,而PRIMARY KEY不允许出现 NULL 值,因为可以认为:
PRIMARY KEY = UNIQUE + NOT NULL
一张表可以包含多个UNIQUE字段,但是只能有一个主键。
CREATE TABLE时的UNIQUE约束示例:
在Mysql环境中:
执行如下SQL语句,创建Persons表时在P_Id列上创建UNIQUE约束。
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)
);
DROP TABLE Persons;
在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约束,请使用下面的SQL语法。
执行如下SQL语句,创建表Persons时在P_Id列和LastName列上创建UNIQUE约束。
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)
);
DROP TABLE Persons;
ALTER TABLE时的UNIQUE约束的示例:
当表已被创建时,在Persons表的P_Id列创建UNIQUE约束。
执行如下SQL语句,先创建Persons表,然后在Persons表的P_Id列创建UNIQUE约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD UNIQUE (P_Id);
DROP TABLE Persons;
当表已被创建时,如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法。
执行如下SQL语句,先创建Persons表,然后在Persons表的P_Id列和LastName列创建UNIQUE约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);
撤销UNIQUE约束的示例:
在Mysql环境中:
执行如下SQL语句,撤销UNIQUE约束。
ALTER TABLE Persons
DROP INDEX uc_PersonID;
DROP TABLE Persons;
在SQL Server/Oracle/MS Access环境中:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID;
4.PRIMARY KEY约束
PRIMARY KEY约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含NULL值。每个表都应该有一个主键,并且每个表只能有一个主键。
CREATE TABLE时的PRIMARY KEY约束的示例:
执行如下SQL语句,在Persons表创建时在P_Id列上创建PRIMARY KEY约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);
DROP TABLE Persons;
在SQL Server/Oracle/MS Access环境中:
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法。
执行如下SQL语句,创建表Persons时在P_Id列和LastName列上创建PRIMARY KEY约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);
DROP TABLE Persons;
ALTER TABLE时的SQL PRIMARY KEY约束的示例:
当表已被创建时,在表Persons的LastName列创建PRIMARY KEY约束。
执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列创建PRIMARY KEY约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id);
DROP TABLE Persons;
当表已被创建时,如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法。
执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和LastName列创建PRIMARY KEY约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName);
撤销PRIMARY KEY约束的示例:
在Mysql环境中:
执行如下SQL语句,撤销PRIMARY KEY约束。
ALTER TABLE Persons
DROP PRIMARY KEY;
DROP TABLE Persons;
在SQL Server/Oracle/MS Access环境中:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID;
5.FOREIGN KEY约束
一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY(唯一约束的键)。
FOREIGN KEY约束的原理:
假如我们有如下图两张表,Orders表中的P_Id列指向Persons表中的P_Id列。Persons表中的P_Id列是Persons表中的PRIMARY KEY。Orders表中的P_Id列是Orders表中的FOREIGN KEY。FOREIGN KEY约束用于预防破坏表之间连接的行为。FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CREATE TABLE时的FOREIGN KEY约束的示例:
在Mysql环境中:
执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和LastName列创建PRIMARY KEY约束。然后创建Orders表时在P_Id列上创建FOREIGN KEY约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);
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)
);
DROP TABLE Orders;
在SQL Server/Oracle/MS Access环境中:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
);
如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法。
执行如下SQL语句,创建表Orders时在P_Id列上创建FOREIGN KEY约束。
CREATE TABLE Orders
(
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)
);
DROP TABLE Orders;
ALTER TABLE 时的FOREIGN KEY约束的示例:
当Orders表已被创建时,如需在P_Id列创建FOREIGN KEY约束,请使用下面的 SQL。
执行如下SQL语句,先创建Orders表,然后在表Orders的P_Id列创建FOREIGN KEY约束。
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id)
);
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id);
DROP TABLE Orders;
如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法。
执行如下SQL语句,先创建Orders表,然后在表Orders的P_Id列创建FOREIGN KEY约束。
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id)
);
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id);
撤销FOREIGN KEY约束的示例:
在Mysql环境中:
执行如下SQL语句,撤销FOREIGN KEY约束。
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders;
DROP TABLE Orders;
DROP TABLE Persons;
在SQL Server/Oracle/MS Access环境中:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders;