SQL学习笔记6:进阶之SQL Constraints(约束)
SQL约束(Constraints): SQL约束用于限制一个表中数据的类型,可以在建表时(使用CREATE TABLE语句),也可以在建表后(使用ALTER TABLE)来指定约束。
约束包括以下几种:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
- NOT NULL: 强制表中某列不接受空值。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
- UNIQUE: 此约束使表中某列值唯一,PRIMARY KEY自动包含此约束.
Example:
在创建表的同时创建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约束
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)
)
修改已经存在的表,以使表中某列使用UNIQUE约束
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
删除UNIQUE约束
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
- PRIMARY KEY
每个表应该有且仅有一个主键约束
Example:
创建表的同时创建主键约束
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
可以对多列的组合定义主键约束
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)
)
在这个例子中,主键为pk_PersonID, 主键的值由两列组成,P_Id和LastName
设定已经存在的表的主键约束
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
删除主键约束
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
- FOREIGN KEY
一个表的外键指向另一个表的主键。
外键可以阻止破坏表间连接的行为。
外键约束可以阻止无效数据被插入外键所在的列,因为外键所在列的数据需要来自外键指向的表。
Example:
建表的同时添加外键约束
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
定义多列的外键约束
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)
)
向已经存在的表中加外键约束
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
删除外键约束
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
- CHECK: 用于限制表中数据列值的范围
创建表时定义CHECK约束
对单列定义:
CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
对多列定义:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
对已经存在的表添加CHECK约束
ALTER TABLE Persons
ADD CHECK (P_Id>0)
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
删除CHECK约束
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
- DEFAULT: 用于向表中某列添加默认值。
新建表时同时定义某列的default值
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
也可以定义系统值
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
修改表以定义该表某列的default值
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
删除default约束
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT