Я пытаюсь удалить все строки в двух зависимых таблицах на основе третьи таблицы 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)
Вы не можете удалить из таблицы, пока в другой таблице все еще существуют зависимые записи. В вашем случае зависимость проходит как это
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
, независимо от того, есть ли какие-либо предметы в нем. Если это не то, что вы хотите, вопрос необходимо уточнить.
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 на ограничение вашего иностранного ключа
.