1. 什么是外键约束
外键约束是关系型数据库中一种非常常用的约束,它用来保证关系模型的完整性和一致性,防止出现脏数据。?
数据库中表与表之间常常存在一定的关系,如自然人和车辆之间是拥有关系,而车辆和厂商之间是生产关系。这种关系是通过外键实现的,外键是一种实体属性或不完整的项集,它在一个关系表中引用另一个关系表中的主键,做到两个表之间的关联。
例如我们有两张表:s_user(用户表),s_order(订单表),订单表中记录了用户购买的订单,如果我们需要将订单表中的user_id
字段与用户表中的id
字段关联在一起,就需要用到外键约束。
CREATE TABLE s_user(
id INT PRIMARY KEY,
name VARCHAR(20),
age INT
);
CREATE TABLE s_order(
id INT PRIMARY KEY,
order_info VARCHAR(50),
user_id INT,
CONSTRAINT fk_user_id FOREIGN KEY(user_id) REFERENCES s_user(id)
);
2. 外键约束的作用
2.1 维护数据完整性
当在s_order表中插入一条数据时,如果用户表s_user中并不存在该user_id,则会违反外键约束,不能插入该数据,从而保证了数据的一致性,避免了脏数据的产生。
-- 如果s_user表中不存在id=3的用户,则无法插入下面这条订单数据
INSERT INTO s_order (id,order_info,user_id) VALUES (1, 'order info1', 3);
2.2 避免数据意外删除
外键约束的另一个重要作用是避免数据意外删除。当我们在s_user表中删除一条数据时,如果该用户id在s_order表中存在相应的数据,则会违反外键约束而无法删除;如果不存在则可以正常删除。
-- 如果s_order表中存在user_id=1的数据,则无法删除s_user表中id=1的用户
DELETE FROM s_user WHERE id=1;
3. 如何创建外键约束
在SQL Server中,可以通过以下方式创建外键约束:
3.1 在创建表时添加外键约束
在创建表时,使用CONSTRAINT关键字来添加外键约束。
CREATE TABLE s_order(
id INT PRIMARY KEY,
order_info VARCHAR(50),
user_id INT CONSTRAINT fk_user_id FOREIGN KEY(user_id) REFERENCES s_user(id)
);
3.2 在已有表上添加外键约束
在已有表上,使用ALTER TABLE语句来添加外键约束。
ALTER TABLE s_order ADD CONSTRAINT fk_user_id FOREIGN KEY(user_id) REFERENCES s_user(id);
3.3 外键约束的参数
在创建外键约束时,有一些参数需要注意:
CONSTRAINT:外键约束的名称
FOREIGN KEY:引用外键表的字段
REFERENCES:被引用的主键表和字段
ON DELETE:当被引用的主键表中有相应数据被删除时,如何处理外键表的数据。常见的选项有CASCADE、SET NULL、SET DEFAULT
ON UPDATE:当被引用的主键表中有相应数据被更新时,如何处理外键表的数据。常见的选项有CASCADE、SET NULL、SET DEFAULT
4. 如何删除外键约束
在灵活使用外键约束时,我们经常需要删除外键约束。在SQL Server中,可以使用以下方式删除外键约束:
4.1 在创建表时删除外键约束
在创建表时,使用CONSTRAINT关键字,并在外键名称前加上DROP IF EXISTS即可删除外键约束。
CREATE TABLE s_order(
id INT PRIMARY KEY,
order_info VARCHAR(50),
user_id INT CONSTRAINT fk_user_id FOREIGN KEY(user_id) REFERENCES s_user(id) DROP IF EXISTS;
);
4.2 使用 ALTER TABLE 语句删除外键约束
在已有的表上,使用ALTER TABLE语句,并在外键名称前加上DROP CONSTRAINT即可删除外键约束。
ALTER TABLE s_order DROP CONSTRAINT fk_user_id;
5. 总结
通过本文的介绍,我们可以了解到外键约束在SQL Server中的作用、如何创建外键约束以及如何删除外键约束。外键约束可以保证数据的完整性,防止脏数据的产生和数据的意外删除,是关系型数据库中非常重要的一种约束,值得我们在实际应用中加以灵活运用。