MySQL默认的ON DELETE行为是什么?
MySQL是一种常用的关系型数据库管理系统。当我们在数据库中创建外键时,一般都会涉及到ON DELETE语句,用于控制外键引用的行在主键被删除时的行为。下面详细介绍MySQL的默认ON DELETE行为。
阅读更多:MySQL 教程
MySQL的默认ON DELETE行为
MySQL默认的ON DELETE行为有四种。如果在创建外键时未指定ON DELETE,MySQL将采用以下默认行为:
- RESTRICT
RESTRICT是MySQL的默认删除行为。它可以防止删除操作引起违反参照完整性,即在主键被删除时,如果有任何外键引用主键上的数据,则无法删除主键。下面是一个示例:
CREATE TABLE departments (
dept_id INT NOT NULL,
dept_name VARCHAR(100),
PRIMARY KEY (dept_id)
);
CREATE TABLE employees (
emp_id INT NOT NULL,
emp_name VARCHAR(100),
dept_id INT,
PRIMARY KEY (emp_id),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id) ON DELETE RESTRICT
);
DELETE FROM departments WHERE dept_id = 1;
在该示例中,当我们尝试删除departments表中dept_id为1的行时,由于employees表有dept_id为1的外键引用,MySQL会报错并拒绝删除该行。
- CASCADE
CASCADE指定如果主键被删除,则外键也将被删除。例如:
CREATE TABLE courses (
course_id INT NOT NULL,
course_name VARCHAR(100),
PRIMARY KEY (course_id)
);
CREATE TABLE enrollments (
enrollment_id INT NOT NULL,
student_id INT,
course_id INT,
PRIMARY KEY (enrollment_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE
);
DELETE FROM courses WHERE course_id = 1;
在该示例中,当我们删除courses表中course_id为1的行时,enrollments表中的所有与该课程有关的行都将被删除。
- SET NULL
SET NULL指定如果主键被删除,则外键的值将设置为NULL。例如:
CREATE TABLE accounts (
account_id INT NOT NULL,
account_name VARCHAR(100),
PRIMARY KEY (account_id)
);
CREATE TABLE users (
user_id INT NOT NULL,
user_name VARCHAR(100),
account_id INT,
PRIMARY KEY (user_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE SET NULL
);
DELETE FROM accounts WHERE account_id = 1;
在该示例中,当我们删除accounts表中account_id为1的行时,users表中account_id为1的行的值将被设置为NULL。
- NO ACTION
NO ACTION指定在删除主键时,MySQL将不采取任何行动。这意味着MySQL将不会检查外键,并将尝试删除主键上的行。例如:
CREATE TABLE suppliers (
supplier_id INT NOT NULL,
supplier_name VARCHAR(100),
PRIMARY KEY (supplier_id)
);
CREATE TABLE products (
product_id INT NOT NULL,
product_name VARCHAR(100),
supplier_id INT,
PRIMARY KEY (product_id),
FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id) ON DELETE NO ACTION
);
DELETE FROM suppliers WHERE supplier_id = 1;
在该示例中,当我们删除suppliers表中supplier_id为1的行时,MySQL不会检查products表中是否有外键引用,将尝试删除supplier_id为1的行。
总结
MySQL的默认ON DELETE行为包括RESTRICT、CASCADE、SET NULL和NO ACTION四种。我们可以根据实际情况选择合适的ON DELETE语句。如果我们在创建外键时没有指定ON DELETE,MySQL将使用默认行为RESTRICT。因此,在创建外键时,建议我们始终指定ON DELETE语句,以便明确采取的行动。
极客教程