[MySQL]: УДАЛИТЕ строки из двух зависимых таблиц

Я пытаюсь удалить все строки в двух зависимых таблицах на основе третьи таблицы ID.

Структура таблицы:

Transaction
-Transaction_ID (primary)
-Timestamp

Purchase
-Item_ID
-Transaction_ID
-Purchase_ID (primary)

Item
-Item_ID (primary)
-Client_ID

Я хотел бы удалить все строки из транзакции/покупки, которые соответствуют Client_ID в объекте. Звучит достаточно простым... даже я могу перенести свой ум новичка вокруг этого...

DELETE dbName.t FROM
  dbName.Transaction t
JOIN
  dbName.Purchase p
 ON
  p.Transaction_ID = t.Transaction_ID
JOIN
  dbName.Item i
 ON
  p.Item_ID = i.Item_ID
WHERE
  Client_ID = 1

Нет...

Я получаю эту ошибку foreign key constraint fails... - Я уверен, что многие из Вас не удивлены.

Проблема, та Покупка использует t. Transaction_ID? - (таким образом, этот внешний ключ перестал бы работать),

ИЛИ есть ли вероятный другой t. Зависимые данные Transaction_ID в этой таблице (я не нашел никого).

Править: COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction`  
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE)
5
задан Derek Adair 6 January 2010 в 16:27
поделиться

2 ответа

Вы не можете удалить из таблицы, пока в другой таблице все еще существуют зависимые записи. В вашем случае зависимость проходит как это

Transaction <- Purchase -> Item

, поэтому сначала нужно удалить любые покупки, прежде чем вы сможете удалить транзакции.

В качестве альтернативы этого двухэтапного подхода я бы порекомендовал создать на удалении каскада и перейти к этому:

DELETE 
  Transaction 
WHERE 
  Transaction_ID IN (
    SELECT 
      Transaction_ID 
    FROM
      Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID
    WHERE
      Item.Client_ID = <your Client ID here>
  )

Остерегайтесь, что это удаляет любой транзакция (И, через каскад, любой покупка ), где есть зависимый пункт с соответствующим Client_id , независимо от того, есть ли какие-либо предметы в нем. Если это не то, что вы хотите, вопрос необходимо уточнить.

4
ответ дан 14 December 2019 в 13:37
поделиться
Transaction <- Purchase -> Item

Ваша проблема в том, что вы пытаетесь удалить транзакцию перед тем, как удалить покупку, правильный способ сделать это - это удалить покупку и только потом транзакцию, которую, или вы могли бы использовать ON DELETE CASCADE на ваших иностранных ключах, похоже, что вы используете ON DELETE RESTRICT.

Смотрите здесь: http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

Кроме того, если вы не хотите быть уверены в том, что именно по этой причине вы должны дать полную ошибку, СУБД обычно сообщает вам, какое нарушение иностранного ключа приводит к ошибке.

UPDATE: ваша ошибка ясно дала понять, проблема в том, что вы сначала удаляете Покупку, а затем Транзакцию, вам нужно сделать это задом наперёд или установить ON DELETE CASCADE на ограничение вашего иностранного ключа

.
2
ответ дан 14 December 2019 в 13:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: