从 table 中删除一行
Delete a row from the table
我在 mysql InnoDB 中创建了一个模式 .sql
:
CREATE DATABASE IF NOT EXISTS sailors;
USE sailors;
DROP TABLE IF EXISTS reserves;
DROP TABLE IF EXISTS sailors;
DROP TABLE IF EXISTS boats;
CREATE TABLE sailors
(
sid INTEGER NOT NULL ,
sname VARCHAR(20) NOT NULL ,
rating INTEGER NULL ,
age DECIMAL(5,2) NULL,
CONSTRAINT sailors_pk PRIMARY KEY (sid)
);
CREATE TABLE boats
(
bid INTEGER NOT NULL ,
bname VARCHAR(20) NOT NULL ,
color VARCHAR(10) NOT NULL ,
CONSTRAINT boats_pk PRIMARY KEY (bid)
);
CREATE TABLE reserves
(
sid INTEGER NOT NULL ,
bid INTEGER NOT NULL ,
day DATE NOT NULL ,
CONSTRAINT reserves_pk PRIMARY KEY (sid,bid,day)
, foreign key (sid) references sailors (sid)
, foreign key (bid) references boats (bid)
);
INSERT INTO sailors VALUES(22, 'Dustin', 7, 45.0);
INSERT INTO sailors VALUES(29, 'Brutus', 1, 33.0);
INSERT INTO sailors VALUES(31, 'Lubber', 8, 55.5);
INSERT INTO sailors VALUES(32, 'Audy', 8, 25.5);
INSERT INTO sailors VALUES(58, 'Rusty', 10, 35.5);
INSERT INTO sailors VALUES(64, 'Horatio',7, 35.0);
INSERT INTO sailors VALUES(71, 'Zorba', 10, 16.0);
INSERT INTO sailors VALUES(74, 'Horatio',9, 35.0);
INSERT INTO sailors VALUES(85, 'Art', 3, 25.5);
INSERT INTO sailors VALUES(95, 'Bob', 3, 63.5);
INSERT INTO boats VALUES(101, 'Interlake', 'blue');
INSERT INTO boats VALUES(102, 'Interlake', 'red');
INSERT INTO boats VALUES(103, 'Clipper', 'green');
INSERT INTO boats VALUES(104, 'Marine', 'red');
INSERT INTO boats VALUES(105, 'Clipper', 'white');
INSERT INTO reserves VALUES(22, 101, DATE '2012-10-10');
INSERT INTO reserves VALUES(22, 102, DATE '2012-10-10');
INSERT INTO reserves VALUES(22, 103, DATE '2012-08-10');
INSERT INTO reserves VALUES(22, 104, DATE '2012-07-10');
INSERT INTO reserves VALUES(31, 102, DATE '2012-10-11');
INSERT INTO reserves VALUES(31, 103, DATE '2012-06-11');
INSERT INTO reserves VALUES(31, 104, DATE '2012-12-11');
INSERT INTO reserves VALUES(64, 101, DATE '2012-05-09');
INSERT INTO reserves VALUES(64, 102, DATE '2012-08-09');
INSERT INTO reserves VALUES(74, 103, DATE '2012-08-09');
现在我想从所有 table 中删除关于名为 Lubber
的水手的所有信息。我执行以下操作:
DELETE FROM sailors
WHERE sname = 'Lubber';
并希望他被删除,但我却收到错误消息:
00:27:03 DELETE FROM sailors WHERE sname = 'Lubber' Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`sailors`.`reserves`, CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `sailors` (`sid`)) 0.016 sec.
所以,我尝试了另一种我知道的方法,但我在这里也失败了。这是方法及其失败。
DELETE sailors, reserves
FROM sailors
INNER JOIN reserves ON (sailors.sid = reserves.sid)
WHERE sname = 'Lubber';
00:28:22 DELETE sailors, reserves FROM sailors INNER JOIN reserves ON (sailors.sid = reserves.sid) WHERE sname = 'Lubber' Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`sailors`.`reserves`, CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `sailors` (`sid`)) 0.000 sec
我真的卡住了,不知道还能尝试什么。将不胜感激任何帮助,感谢您的关注。
您的卖家 table 与储备 table 有关系。通常,当您尝试删除父记录以避免孤立数据时,innodb 会抛出错误。以下是一些备选方案
使用应用程序逻辑删除子记录 1st
删除父记录时使用级联删除所有子记录。(可能很危险,例如:删除水手时可能会失去所有储备)
使用软删除(将 is_deleted 之类的标志设置为是或否)(强烈推荐)
您可以执行以下级联操作,这将在删除父记录时删除所有子记录
CREATE TABLE reserves
(
sid INTEGER NOT NULL ,
bid INTEGER NOT NULL ,
day DATE NOT NULL ,
CONSTRAINT reserves_pk PRIMARY KEY (sid,bid,day)
, foreign key (sid) references sailors (sid) ON DELETE CASCADE
, foreign key (bid) references boats (bid) ON DELETE CASCADE
)
由于 reserves
table 上的 foreign key (sid) references sailors (sid)
,以下内容是维护数据完整性所必需的。理想情况下,这两个语句将在单个事务中发出,或者更好的是,从存储过程中发出。
DELETE FROM reserves
WHERE sid in (
SELECT s.sid
FROM sailors s
WHERE s.sname = 'Lubber' );
DELETE FROM sailors
WHERE sname = 'Lubber';
我在 mysql InnoDB 中创建了一个模式 .sql
:
CREATE DATABASE IF NOT EXISTS sailors;
USE sailors;
DROP TABLE IF EXISTS reserves;
DROP TABLE IF EXISTS sailors;
DROP TABLE IF EXISTS boats;
CREATE TABLE sailors
(
sid INTEGER NOT NULL ,
sname VARCHAR(20) NOT NULL ,
rating INTEGER NULL ,
age DECIMAL(5,2) NULL,
CONSTRAINT sailors_pk PRIMARY KEY (sid)
);
CREATE TABLE boats
(
bid INTEGER NOT NULL ,
bname VARCHAR(20) NOT NULL ,
color VARCHAR(10) NOT NULL ,
CONSTRAINT boats_pk PRIMARY KEY (bid)
);
CREATE TABLE reserves
(
sid INTEGER NOT NULL ,
bid INTEGER NOT NULL ,
day DATE NOT NULL ,
CONSTRAINT reserves_pk PRIMARY KEY (sid,bid,day)
, foreign key (sid) references sailors (sid)
, foreign key (bid) references boats (bid)
);
INSERT INTO sailors VALUES(22, 'Dustin', 7, 45.0);
INSERT INTO sailors VALUES(29, 'Brutus', 1, 33.0);
INSERT INTO sailors VALUES(31, 'Lubber', 8, 55.5);
INSERT INTO sailors VALUES(32, 'Audy', 8, 25.5);
INSERT INTO sailors VALUES(58, 'Rusty', 10, 35.5);
INSERT INTO sailors VALUES(64, 'Horatio',7, 35.0);
INSERT INTO sailors VALUES(71, 'Zorba', 10, 16.0);
INSERT INTO sailors VALUES(74, 'Horatio',9, 35.0);
INSERT INTO sailors VALUES(85, 'Art', 3, 25.5);
INSERT INTO sailors VALUES(95, 'Bob', 3, 63.5);
INSERT INTO boats VALUES(101, 'Interlake', 'blue');
INSERT INTO boats VALUES(102, 'Interlake', 'red');
INSERT INTO boats VALUES(103, 'Clipper', 'green');
INSERT INTO boats VALUES(104, 'Marine', 'red');
INSERT INTO boats VALUES(105, 'Clipper', 'white');
INSERT INTO reserves VALUES(22, 101, DATE '2012-10-10');
INSERT INTO reserves VALUES(22, 102, DATE '2012-10-10');
INSERT INTO reserves VALUES(22, 103, DATE '2012-08-10');
INSERT INTO reserves VALUES(22, 104, DATE '2012-07-10');
INSERT INTO reserves VALUES(31, 102, DATE '2012-10-11');
INSERT INTO reserves VALUES(31, 103, DATE '2012-06-11');
INSERT INTO reserves VALUES(31, 104, DATE '2012-12-11');
INSERT INTO reserves VALUES(64, 101, DATE '2012-05-09');
INSERT INTO reserves VALUES(64, 102, DATE '2012-08-09');
INSERT INTO reserves VALUES(74, 103, DATE '2012-08-09');
现在我想从所有 table 中删除关于名为 Lubber
的水手的所有信息。我执行以下操作:
DELETE FROM sailors
WHERE sname = 'Lubber';
并希望他被删除,但我却收到错误消息:
00:27:03 DELETE FROM sailors WHERE sname = 'Lubber' Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`sailors`.`reserves`, CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `sailors` (`sid`)) 0.016 sec.
所以,我尝试了另一种我知道的方法,但我在这里也失败了。这是方法及其失败。
DELETE sailors, reserves
FROM sailors
INNER JOIN reserves ON (sailors.sid = reserves.sid)
WHERE sname = 'Lubber';
00:28:22 DELETE sailors, reserves FROM sailors INNER JOIN reserves ON (sailors.sid = reserves.sid) WHERE sname = 'Lubber' Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`sailors`.`reserves`, CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `sailors` (`sid`)) 0.000 sec
我真的卡住了,不知道还能尝试什么。将不胜感激任何帮助,感谢您的关注。
您的卖家 table 与储备 table 有关系。通常,当您尝试删除父记录以避免孤立数据时,innodb 会抛出错误。以下是一些备选方案
使用应用程序逻辑删除子记录 1st
删除父记录时使用级联删除所有子记录。(可能很危险,例如:删除水手时可能会失去所有储备)
使用软删除(将 is_deleted 之类的标志设置为是或否)(强烈推荐)
您可以执行以下级联操作,这将在删除父记录时删除所有子记录
CREATE TABLE reserves
(
sid INTEGER NOT NULL ,
bid INTEGER NOT NULL ,
day DATE NOT NULL ,
CONSTRAINT reserves_pk PRIMARY KEY (sid,bid,day)
, foreign key (sid) references sailors (sid) ON DELETE CASCADE
, foreign key (bid) references boats (bid) ON DELETE CASCADE
)
由于 reserves
table 上的 foreign key (sid) references sailors (sid)
,以下内容是维护数据完整性所必需的。理想情况下,这两个语句将在单个事务中发出,或者更好的是,从存储过程中发出。
DELETE FROM reserves
WHERE sid in (
SELECT s.sid
FROM sailors s
WHERE s.sname = 'Lubber' );
DELETE FROM sailors
WHERE sname = 'Lubber';