如何解决MySQL中的“无法删除或更新父行”错误

How to resolve the "Cannot delete or update a parent row" error in MySQL

提问人:David 提问时间:3/10/2023 最后编辑:halferDavid 更新时间:3/12/2023 访问量:32

问:

我不断得到:

错误代码:1451。无法删除或更新父行:MySQL上的外键约束失败。

它只出现在“drop table if exists branches”和“drop table if exists staff”上,但其余的功能正常。

CREATE DATABASE IF NOT EXISTS Optician;
USE Optician;

DROP TABLE IF EXISTS branches;
CREATE TABLE branches (
  branch_id INT PRIMARY KEY,
  branch_name VARCHAR(255) NOT NULL,
  branch_address ENUM('Cardiff', 'Swansea', 'Newport') NOT NULL,
  staff_available BOOLEAN NOT NULL
);

DROP TABLE IF EXISTS staff;
CREATE TABLE staff (
  staff_id INT PRIMARY KEY,
  staff_name VARCHAR(255) NOT NULL,
  staff_role ENUM('Optician', 'Receptionist', 'Technician') NOT NULL,
  staff_available BOOLEAN DEFAULT true,
  welsh_speaker BOOLEAN DEFAULT false,
  branch_id INT,
  FOREIGN KEY (branch_id) 
  REFERENCES branches(branch_id) ON DELETE CASCADE
);

DROP TABLE IF EXISTS appointments;
CREATE TABLE appointments (
  appointment_id INT PRIMARY KEY,
  customer_name VARCHAR(255) NOT NULL,
  appointment_type VARCHAR(255) NOT NULL,
  appointment_date DATE NOT NULL,
  appointment_time TIME NOT NULL,
  staff_id INT NOT NULL,
  FOREIGN KEY (staff_id) 
  REFERENCES staff(staff_id) ON DELETE CASCADE,
  UNIQUE (appointment_date, appointment_time, staff_id)
);


DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_name VARCHAR(255) NOT NULL,
  customer_phone VARCHAR(225) NOT NULL,
  customer_email VARCHAR(255) NOT NULL,
  order_type VARCHAR(255) NOT NULL,
  order_status VARCHAR(255) NOT NULL,
  order_date DATE NOT NULL,
  technician_id INT NOT NULL,
  lens_arrival_date DATE,
  assembly_start_date DATE,
  assembly_completion_date DATE,
  FOREIGN KEY (technician_id) 
  REFERENCES staff(staff_id)
);
MySQL 数据库 错误处理

评论

1赞 P.Salmon 3/10/2023
您需要按顺序删除约会、员工、分支机构,换句话说,必须先删除包含 FK 的表,然后才能删除引用的表。还有你想放弃的理由吗?
0赞 David 3/10/2023
我删除的原因是,当我删除时,我收到一个名为“如果表 1050 不存在”的错误。我是MYSQL的新手,所以我正在尝试弄清楚一些东西。
0赞 P.Salmon 3/10/2023
我不明白您的最后一条评论“当我删除掉落时,我收到一个名为”如果表 1050 不存在“的错误 - 您正在做什么来抛出此错误?

答:

0赞 P.Salmon 3/10/2023 #1

第一次运行代码时没有问题,因为需要在引用表(带有 FK 的表)之前创建引用表。再次运行代码时,必须先删除引用表(带有 FK 的表),然后才能删除引用的表。

或者,如果数据库包含要删除的所有表,则可以删除数据库并再次运行代码。

在现实世界的 aps 中,一旦数据库启动并运行,为了进行表更改而删除表是不寻常的,更常见的是使用 ALTER 表来修改表。