sql使用小技巧之约束(Constraints、FOREIGN KEY、CHECK、DEFAULT)简单了解下

一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),我们来通过一个实例来解释外键,看一下下面的两个表:

P_IdLastNameFirstNameAddressCity
1HansenOlaTimoteivn 10Sandnes
2SvendsonToveBorgvn 23Sandnes
3PettersenKariStorgt 20Stavanger
O_IdOrderNoP_Id
1778953
2446783
3224562
4245621

通过对比,我们可以看到"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

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值