MySQL默认的ON DELETE行为是什么?

MySQL默认的ON DELETE行为是什么?

MySQL是一种常用的关系型数据库管理系统。当我们在数据库中创建外键时,一般都会涉及到ON DELETE语句,用于控制外键引用的行在主键被删除时的行为。下面详细介绍MySQL的默认ON DELETE行为。

阅读更多:MySQL 教程

MySQL的默认ON DELETE行为

MySQL默认的ON DELETE行为有四种。如果在创建外键时未指定ON DELETE,MySQL将采用以下默认行为:

  1. 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会报错并拒绝删除该行。

  1. 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表中的所有与该课程有关的行都将被删除。

  1. 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。

  1. 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语句,以便明确采取的行动。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程