sql_外键

34 篇文章 1 订阅

一、外键的定义

1. 外键是一种索引,是通过一张表中的一列指向另一张表的主键,使得这两张表产生关联

2. 是某个表中的一列,它包含在另一个表的主键中

3. 一张表中可以有一个外键也可以有多个外键

二、外键的作用

减少单张表的冗余信息

三、使用外键后想要删除/更新主表的相关列会报错,因为从表正在使用。使用外键后若想向从表中插入新列,但是外键值主表中没有,会报错,更新从表的外键值,但是值不在从表中会报错。

 

四、如何创建外键

法1:创建表的时候添加外键

CONSTRAINT 约束名 FOREIGN KEY(字段名) REFERENCES 主表(被引用列)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
NO ACTION:同 RESTRICT,也是首先先检查外键;

其中跟随外键改动是:删除主表中,外键行时,从表相关行也删除。更新主表中外键相关行时,从表的使用行也改变

若,事触发限制为默认值,限制外表中外键的改动,则在添加外键之后对表中数据的增删改查都需要注意

例:

CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
sex VARCHAR(255),
age INT);

CREATE TABLE IF NOT EXISTS student_score(
id INT PRIMARY KEY AUTO_INCREMENT,
class VARCHAR(20),
score INT,
student_id INT,
CONSTRAINT fk_s_id FOREIGN KEY(student_id) REFERENCES student(id))

法2:修改表时添加外键约束

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 外表表名(主键字段名)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 

例如,1.向从表中插入新行,但是外键值不在主表中,会报错

#向从表中插入新行,但是外键值不在主表中,会报错
INSERT INTO student_score(`class`,`student_id`,`score`) VALUES ('语文',2,100)

 2.

#更新从表外键值,新值不在主表中,会报错
UPDATE student_score SET student_id=2
WHERE student_id=1

3.

#主表想要删除行,但是主键值在从表里存在,会报错(必须先删除从表使用行,才能再删主表的相关行)--或者采用级联删除

DELETE FROM student
WHERE id=1;


#级联删除 on delete cascade
 
ALTER TABLE student_score DROP FOREIGN KEY fk_s_id;

ALTER TABLE student_score ADD CONSTRAINT fk_s_id FOREIGN KEY(student_id)
REFERENCES student(id) ON DELETE CASCADE 

4.

#主表修改主键值,但是旧值在从表中使用了,会报错,必须先删除从表的使用行,才能再修改--或者采用级联更新
#级联更新
on update cascadde


UPDATE student SET id = 2 WHERE id = 1;


ALTER TABLE student_score DROP FOREIGN KEY fk_s_id;

ALTER TABLE student_score ADD CONSTRAINT fk_s_id FOREIGN KEY(student_id)
REFERENCES student(id) ON update CASCADE  

 

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL 中,外键约束可以用于确保表之间的数据完整性。当一个表中的一行被删除时,如果存在与它相关联的外键,那么默认情况下,数据库会拒绝删除该行,以保持数据的完整性。但是,有时候我们可能需要删除主表中的某行数据,而不希望删除与之相关联的外键。这时候可以使用外键设置为 NULL 的方式来解决这个问题。 在创建外键时,可以使用 `ON DELETE SET NULL` 选项来设置外键的行为。这样,当主表中的某行数据被删除时,与之相关联的外键值将被设置为 NULL,而不是拒绝删除。这样就可以保持数据的完整性,同时也不会影响到其他表的数据。 以下是一个使用外键设置为 NULL 的示例: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET NULL ); CREATE TABLE customers ( customer_id INT PRIMARY KEY, customer_name VARCHAR(50), customer_email VARCHAR(50) ); ``` 在上面的示例中,orders 表中的 customer_id 列是一个外键,它引用了 customers 表中的 customer_id 列。在创建外键时,我们使用了 `ON DELETE SET NULL` 选项来设置外键的行为。这样,当 customers 表中的某行数据被删除时,与之相关联的 orders 表中的 customer_id 值将被设置为 NULL。这样就可以保持数据的完整性,同时也不会影响到 orders 表中的其他数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值