sql外键约束NO ACTION,CASCADE,SET NULL,SET DEFAULT

NO ACTION
指定如果试图删除/修改某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE/UPDATE语句。


CASCADE、SET NULL 和 SET DEFAULT
允许通过删除或更新键值来影响指定具有外键关系的表,这些外键关系可追溯到在其中进行修改的表。如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestamp 列的外键或主键指定 CASCADE。


ON DELETE CASCADE
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。


ON UPDATE CASCADE
指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。 (如果 timestamp 列是外键或被引用键的一部分,则不能指定 CASCADE。 )


ON DELETE SET NULL
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。目标表的所有外键列必须可为空值,此约束才可执行。


ON UPDATE SET NULL
指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。目标表的所有外键列必须可为空值,此约束才可执行。


ON DELETE SET DEFAULT
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。目标表的所有外键列必须具有默认值定义,此约束才可执行。如果某个列可为空值,并且未设置显式的默认值,则会使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。


ON UPDATE SET DEFAULT
指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。目标表的所有外键列必须具有默认值定义,此约束才可执行。如果某个列可为空值,并且未设置显式的默认值,则会使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

### SQL约束约束的使用方法 在SQL数据库中,主约束(PRIMARY KEY)和约束(FOREIGN KEY)是确保数据完整性和一致性的关工具。以下详细说明这两种约束的使用方法及常见问题解决方式。 #### 主约束(PRIMARY KEY) 主用于唯一标识表中的每一行记录。一个表只能有一个主,且主值必须唯一且非空。以下是创建主约束的方法: 1. **在创建表时定义主**: ```sql CREATE TABLE employees ( employee_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100) ); ``` 上述代码通过`PRIMARY KEY`关字指定`employee_id`为主[^2]。 2. **在已存在的表中添加主**: ```sql ALTER TABLE employees ADD PRIMARY KEY (employee_id); ``` 该语句将`employee_id`字段设置为主[^3]。 #### 约束(FOREIGN KEY) 用于建立和加强两个表数据之间的链接关系,通常用于维护参照完整性。以下是的使用方法: 1. **在创建表时定义**: ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, employee_id INT, FOREIGN KEY (employee_id) REFERENCES employees(employee_id) ); ``` 在此示例中,`orders`表中的`employee_id`字段引用了`employees`表中的`employee_id`主[^2]。 2. **在已存在的表中添加**: ```sql ALTER TABLE orders ADD CONSTRAINT fk_employee FOREIGN KEY (employee_id) REFERENCES employees(employee_id); ``` 该语句为`orders`表添加了一个名为`fk_employee`的约束[^3]。 #### 常见错误及解决方法 1. **主重复或为空**: 如果插入的数据违反主约束(例如,主值重复或为空),会抛出错误。解决方法是确保插入的主值唯一且非空。 ```sql INSERT INTO employees (employee_id, first_name, last_name, email) VALUES (1, 'John', 'Doe', 'john.doe@example.com'); ``` 2. **引用无效数据**: 当插入或更新字段时,如果引用的主值不存在于父表中,将导致错误。解决方法是先检查父表中是否存在相应的主值。 ```sql INSERT INTO orders (order_id, employee_id) VALUES (101, 1); ``` 3. **删除或更新父表数据引发冲突**: 如果尝试删除或更新父表中被子表引用的主值,可能会引发冲突。可以通过设置`ON DELETE CASCADE`或`ON UPDATE CASCADE`来自动处理相关记录。 ```sql ALTER TABLE orders ADD CONSTRAINT fk_employee FOREIGN KEY (employee_id) REFERENCES employees(employee_id) ON DELETE CASCADE; ``` ### 注意事项 - 主字段通常使用自增整数或UUID以确保唯一性[^1]。 - 约束可以设置为`NO ACTION`、`CASCADE`、`SET NULL`或`SET DEFAULT`,具体取决于业务需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值