Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему на работает запрос на удаление из нескольких таблиц? / 11 сообщений из 11, страница 1 из 1
16.09.2015, 16:46:15
    #39053051
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
Код: sql
1.
2.
3.
4.
5.
DELETE auto_card, auto_cargo_card, cargo_card
      FROM auto_card 
      LEFT JOIN auto_cargo_card ON auto_cargo_card.auto_card_id = auto_card.id 
      LEFT JOIN cargo_card ON cargo_card.id = auto_cargo_card.id 
      WHERE auto_card.id = :auto_card_id



Cannot delete or update a parent row: a foreign key constraint fails (`db`.`auto_cargo_card`, CONSTRAINT `auto_cargo_card_fk1` FOREIGN KEY (`auto_card_id`) REFERENCES `auto_card` (`id`))
...
Рейтинг: 0 / 0
16.09.2015, 18:02:49
    #39053138
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
Нарушение условия целостности... по-моему, тебе вполне вменяемо написана причина.
...
Рейтинг: 0 / 0
16.09.2015, 18:18:31
    #39053152
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
svnvlad,
по двум причинам
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
Код: html
\\r\\n          Like MySQL in general, in an SQL statement that inserts,\\r\\n          deletes, or updates many rows, InnoDB\\r\\n          checks UNIQUE and FOREIGN\\r\\n          KEY constraints row-by-row. When performing foreign\\r\\n          key checks, InnoDB sets shared row-level\\r\\n          locks on child or parent records it has to look at.\\r\\n          InnoDB checks foreign key constraints\\r\\n          immediately; the check is not deferred to transaction commit.\\r\\n          According to the SQL standard, the default behavior should be\\r\\n          deferred checking. That is, constraints are only checked after\\r\\n          the entire SQL statement has been\\r\\n          processed. Until InnoDB implements deferred\\r\\n          constraint checking, some things will be impossible, such as\\r\\n          deleting a record that refers to itself using a foreign key.\\r\\n
\\r\\n

"svnvlad"
Код: sql
\\r\\n          внешние ключи в\\r\\n          auto_cargo_card и cargo_card, ссылаюшиеся соответственно на\\r\\n          auto_card и auto_cargo_card были созданы без кляузы\\r\\n          ON DELETE CASCADE\\r\\n\\r\\n          -- пардон, если "ты не ты, - ты только разместил объяву"\\r\\n          \\r\\n
\\r\\n
...
Рейтинг: 0 / 0
16.09.2015, 18:36:00
    #39053167
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
AkinaНарушение условия целостности... по-моему, тебе вполне вменяемо написана причина.
Так я же и удаляю сразу из трех таблиц, которые связаны друг с другом, а иначе зачем этот синтаксис?
...
Рейтинг: 0 / 0
16.09.2015, 18:42:28
    #39053172
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
);

CREATE TABLE `auto_cargo_card` (
  `id` int(11) unsigned NOT NULL,
  `auto_card_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `auto_card_id` (`auto_card_id`),
  CONSTRAINT `auto_cargo_card_fk1` FOREIGN KEY (`auto_card_id`) REFERENCES `auto_card` (`id`),
  CONSTRAINT `auto_cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE `auto_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE,
);
...
Рейтинг: 0 / 0
16.09.2015, 18:44:15
    #39053174
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
скукотища внешние ключи в
auto_cargo_card и cargo_card, ссылаюшиеся соответственно на
auto_card и auto_cargo_card были созданы без кляузы
ON DELETE CASCADE

ON DELETE CASCADE нельзя чтоли использовать?
...
Рейтинг: 0 / 0
16.09.2015, 18:58:50
    #39053191
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
svnvladТак я же и удаляю сразу из трех таблицЭто тебе только так кажется. А сервер удаляет сначала из одной таблицы, потом из другой, потом из третьей... и где-то посередине обнаруживает траблу. Не тот, панимаешь, порядок.
А поскольку порядок удаления таблиц, который выберет сервер, нигде не определён и никак не зависит от текста запроса, то твоё дело тухлое. Или каскадное удаление, или минус внешний ключ, или три отдельных запроса.
...
Рейтинг: 0 / 0
16.09.2015, 19:10:22
    #39053203
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
svnvlad,
можно, предварительно ознакомившись с документацией.

В первой причине копипасту из неё привел.
По этой причине, если у auto_card с ид = :auto_card_id есть более одной подчиненной записи в auto_cargo_card,
то даже такая утрощенная схема

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
);

CREATE TABLE `auto_cargo_card` (
  `id` int(11) unsigned NOT NULL,
  `auto_card_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `auto_card_id` (`auto_card_id`),
  CONSTRAINT `auto_cargo_card_fk1` FOREIGN KEY (`auto_card_id`) REFERENCES `auto_card` (`id`) -- , ну нет здесь у вас ON 
CASCADE
  -- а из этого ограничения я бы какскадные операции убрал. ИМХО
  -- CONSTRAINT `auto_cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);


на запросе
Код: sql
1.
2.
3.
4.
5.
DELETE auto_card, auto_cargo_card /* , cargo_card */
      FROM auto_card 
      LEFT JOIN auto_cargo_card ON auto_cargo_card.auto_card_id = auto_card.id 
      -- LEFT JOIN cargo_card ON cargo_card.id = auto_cargo_card.id 
      WHERE auto_card.id = :auto_card_id


будет вызывать вышеприведенное исключение
...
Рейтинг: 0 / 0
16.09.2015, 19:21:17
    #39053207
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
> Akina,
> ... или три отдельных запроса.

В таком вырожденном случае, как у ТС - два.
Код: sql
1.
2.
3.
4.
5.
delete a, b
from auto_cargo_card a, cargo_card b
where a.auto_card_id = :auto_card_id and a.id = b.id;

delete from auto_card where id = :auto_card_id;
...
Рейтинг: 0 / 0
16.09.2015, 22:01:31
    #39053291
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
svnvlad,
если запрос
Код: sql
1.
2.
3.
4.
select id, group_concat(auto_card_id) auto_card_ids
  from auto_cargo_card 
  group by id 
  having count(*)>1

вернет какие-нибудь строки, то при попытке удаления любого из указанных в них auto_card_id, независимо от порядка удаления обязательно возникнет ваша ошибка.

Правильнее было бы удалять чем-то вроде этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
START TRANSACTION;

CREATE TEMPORARY TABLE tmp_cargo
SELECT d.id 
FROM auto_cargo_card d
WHERE d.auto_card_id = :auto_id
  AND NOT EXISTS(
    SELECT *
    FROM auto_cargo_card t
    WHERE t.id = d.id AND t.auto_card_id <> d.auto_card_id
    );

DELETE 
FROM auto_cargo_card
WHERE auto_card_id = :auto_id;

DELETE 
FROM auto_card
WHERE id = :auto_id;

DELETE c
FROM cargo_card c
JOIN tmp_cargo d on d.id=c.id;

DROP TEMPORARY TABLE tmp_card;

COMMIT;
...
Рейтинг: 0 / 0
16.09.2015, 22:24:38
    #39053307
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему на работает запрос на удаление из нескольких таблиц?
Немного наврал.. Там id - PK в auto_cargo_card...
Тем не менее, схема допускает для одной auto_card_id несколько разных id в этой таблице, а значит, процедура в целом корректна.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему на работает запрос на удаление из нескольких таблиц? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]