Удалить строку из таблицы

0

Я создал схему в 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');

Теперь я хочу удалить всю информацию из всей таблицы о матросе с именем 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

Я действительно застрял и не знаю, что еще я могу попробовать. Поблагодарите любую помощь, спасибо за внимание.

  • 0
    ФК могут быть неприятностью. Замените их индексами.
Теги:
innodb
delete-row

2 ответа

0
Лучший ответ

Таблица вашего продавца имеет отношения с резервной таблицей. Обычно innodb будет вызывать ошибку при попытке удалить родительскую запись, чтобы избежать сиротских данных. Ниже приведены некоторые альтернативы

  1. Удаление дочерней записи с использованием логики приложения

  2. Используйте каскадирование для удаления всех дочерних записей при удалении родителя (может быть опасно, например: вы можете потерять все резервы при удалении парусников)

  3. Используйте мягкое удаление (установите флаг, например 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 
    )
  • 0
    Я должен удалить моряка с именем Lubber из таблицы, созданной из .sql представленной выше. И я не могу использовать любой софт. Но все равно спасибо за попытку помочь.
  • 0
    Вообще говоря, неявное удаление (вариант 2 - каскад при удалении) недопустимо ни в чем, кроме среды прототипа.
Показать ещё 1 комментарий
0

Из-за foreign key (sid) references sailors (sid) в таблице reserves, для поддержания целостности данных необходимо следующее. В идеале эти два утверждения будут выдаваться в рамках одной транзакции или даже лучше из хранимой процедуры.

DELETE FROM reserves
WHERE sid in (
   SELECT s.sid
   FROM sailors s
   WHERE s.sname = 'Lubber' );

DELETE FROM sailors
WHERE sname = 'Lubber';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню