mysql外键约束规则
时间: 2023-10-14 10:07:21 浏览: 125
MySQL外键约束规则是指在创建表时,通过指定外键约束条件,强制要求该表中的某个字段的值必须存在于另一个表的指定字段中。外键约束的作用是保证数据的一致性和完整性,避免出现无效的数据关联。在MySQL中,外键约束的规则主要包括以下几点:
1. 父表和子表必须使用相同的存储引擎。
2. 父表和子表必须都存在且已经创建。
3. 父表的被引用字段必须是一个索引字段。
4. 父表的被引用字段必须具有唯一性。
5. 子表中的外键字段必须与父表中的被引用字段具有相同的数据类型和长度。
6. 在插入或更新子表的数据时,必须保证外键字段的值存在于父表中的被引用字段中,否则会触发外键约束错误。
以上就是MySQL外键约束的规则,使用外键约束可以有效地避免数据的不一致和不完整,提高数据的质量和准确性。
相关问题
mysql 外键约束多列_MySQL外键约束(FOREIGN KEY)
MySQL 外键约束可以用来保证表与表之间的关系完整性。当我们在一个表中定义了一个外键,它会引用另一个表中的列,这个被引用的列必须是另一个表的主键或者是一个唯一键。在 MySQL 中,外键约束可以跨越多个列。
下面是一个例子,演示如何在 MySQL 中定义一个外键约束,跨越两个列:
```
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id, order_date)
REFERENCES customers(id, date)
);
```
在这个例子中,orders 表中的 customer_id 和 order_date 列都被用来定义外键约束,它们分别引用了 customers 表中的 id 和 date 列。这个外键约束确保了 orders 表中的每一行都有对应的 customers 表中的行,而且这个关联是基于 customer_id 和 order_date 两列的值。
在定义外键约束时,我们还可以指定 ON DELETE 和 ON UPDATE 规则,用来控制当关联表中的某一行被删除或更新时,对应的行应该怎么处理。常用的规则包括:
- CASCADE:当关联表中的某一行被删除或更新时,对应的行也会被删除或更新。
- RESTRICT:当关联表中的某一行被删除或更新时,如果该行有对应的行,则不允许删除或更新。
- SET NULL:当关联表中的某一行被删除或更新时,对应的行的外键列会被设置为 NULL。
我们可以在定义外键约束时使用这些规则,例如:
```
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id, order_date)
REFERENCES customers(id, date)
ON DELETE CASCADE
ON UPDATE RESTRICT
);
```
在这个例子中,我们指定了 ON DELETE CASCADE 和 ON UPDATE RESTRICT 规则,表示当 customers 表中的某一行被删除时,对应的 orders 表中的行也会被删除;当 customers 表中的某一行被更新时,只有当 orders 表中的行没有被引用时,才允许更新。
mysql外键约束
### 如何在 MySQL 中使用外键约束
#### 创建带有外键约束的表结构
在外键关系中,父表中的主键字段与子表中的外键字段形成关联。创建具有外键约束的表格时需指定参照完整性规则。
```sql
CREATE TABLE class (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
PRIMARY KEY (id)
);
CREATE TABLE students (
student_id INT NOT NULL AUTO_INCREMENT,
c_id INT,
s_name VARCHAR(50),
PRIMARY KEY (student_id),
FOREIGN KEY (c_id) REFERENCES class(id)
ON DELETE RESTRICT -- 或者可以是 CASCADE/SET NULL 等策略
);
```
上述 SQL 语句定义了一个班级(`class`)和学生(`students`)之间的父子关系,在此情况下`c_id`作为外键指向`class.id`[^1]。
#### 插入数据到有外键约束的表里
当向含有外键约束条件的目标表插入新纪录之前,必须先确认所涉及的外部引用对象已经存在于源表之中;否则会抛出错误提示。
```sql
INSERT INTO class(name) VALUES ('Math');
-- 假设上面这条命令返回受影响行数为1,则表示新增了一条记录且其ID为1.
INSERT INTO students(c_id,s_name) VALUES (1,'Alice'); -- 正确操作因为存在对应的班级编号.
```
#### 删除或更新受保护的数据项
尝试移除被其他实体依赖的关键字将会触发异常报告,除非事先调整了级联行为或者清除了所有相关联的对象实例。
```sql
DELETE FROM class WHERE id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails...
```
该错误表明无法直接删除正在使用的主键值,因为它正由另一个表内的某些记录所引用着[^2]。
为了绕过这个限制,可以选择如下几种方法之一:
- **更改外键选项**:修改原有的外键声明来允许特定类型的自动处理动作,比如`ON DELETE SET NULL`或是`ON UPDATE CASCADE`.
- **手动清理**:先行定位并消除那些间接阻碍目标变更过程的因素——即先把有关连结切断再继续执行后续指令。
- **临时禁用检查机制**:通过设置全局变量的方式暂时关闭对外部链接一致性的验证功能,不过这通常只适用于非常特殊的情形下,并不推荐常规采用这种方法。
#### 设置外键约束及其作用
外键不仅有助于保持不同表格间的关系一致性,而且还可以防止非法数据进入系统内部造成混乱局面的发生。具体来说,它能够做到以下几点:
- 维护参照完整性:确保每一个外键都对应着有效的主键;
- 自动化维护工作:依据预配置好的规则实现同步更新或清除冗余信息的功能;
- 提升查询效率:利用索引来加速基于多张表联合查找的速度[^3].
阅读全文
相关推荐













