一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),我们来通过一个实例来解释外键,看一下下面的两个表:
P_Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
O_Id | OrderNo | P_Id |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 2 |
4 | 24562 | 1 |
通过对比,我们可以看到"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列,然而,"Persons" 表中的 "P_Id" 列是 "Persons" 表中的 PRIMARY KEY,这也就是说,"Orders" 表中的 "P_Id" 列是 "Orders" 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的行为,它也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
我们接下来尝试使用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),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
我们如果需要命名 FOREIGN KEY 约束,并定义多个列的 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)
)
我们再来看下当表已经存在时,添加和撤销 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 Orders DROP FOREIGN KEY fk_PerOrders
CHECK 约束用于限制列中的值的范围,如果对单个列定义 CHECK 约束,那么该列只允许特定的值,如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
我们接下来使用SQL 在 "Persons" 表创建时在 "P_Id" 列上创建 CHECK 约束,并且CHECK 约束规定 "P_Id" 列必须只包含大于 0 的整数:
创建 CHECK 约束,单个列:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
命名 CHECK 约束,并定义多个列的 CHECK 约束:
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 约束的语法:
创建 CHECK 约束,单个列:
ALTER TABLE Persons ADD CHECK (P_Id>0)
命名 CHECK 约束,并定义多个列的 CHECK 约束:
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
撤销 CHECK 约束:
ALTER TABLE Persons DROP CHECK chk_Person
DEFAULT 约束用于向列中插入默认值,如果没有规定其他的值,那么会将默认值添加到所有的新记录。
我们再来使用SQL 在 "Persons" 表创建时在 "City" 列上创建 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'
)
使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
最后再来看下,当表已经存在时,创建和撤销 DEFAULT 约束的语法:
创建 DEFAULT 约束:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束:
ALTER TABLE Persons ALTER City DROP DEFAULT
好啦,本次记录就到这里了。
如果感觉不错的话,请多多点赞支持哦。。。