2010-01-06 1 views
5

Я пытаюсь удалить все строки в двух зависимых таблицах на основе третьего идентификатора таблицы.[MySQL]: УДАЛИТЬ строки из двух зависимых таблиц

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

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 данные в этой таблице (я их не нашел).

EDIT: 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) 

ответ

4

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

Transaction <- Purchase -> Item 

Для того, чтобы удалить транзакции, сначала необходимо удалить все покупки.

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

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> 
) 

Учтите, что это удаляет любые Transaction (и, через КАСКАД, любой Purchase), где является зависимым Item с соответствием Client_ID, независимо от того, имеются ли какие-либо другие элементы в нем. Если это не то, что вы хотите, вопрос нужно уточнить.

+0

мне кажется наоборот: транзакция зависит от покупки (поскольку я не могу удалить client_id без нее) –

+0

@Derek Adair: Поскольку @AlbertEin был первым, кто правильно ответил на вопрос, и мой пост нуждался в капитальном ремонте прежде чем это будет полезно, пожалуйста, подумайте о принятии его ответа. – Tomalak

+0

Не смотрите внимательно, у вас есть Transaction_ID внутри вашей таблицы Purchase. Если вы сначала удалили транзакцию, таблица Покупки временно содержала бы недействительный Transaction_ID, которого не было. – MindStalker

2
Transaction <- Purchase -> Item 

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

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

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

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

+0

Комментарии ниже моего ответа - это красная селедка. Должны ли мы их удалить? – Tomalak

+0

У меня нет проблем. Поэтому, если вы удалите их, я тоже их удалю;) – albertein

+0

Хорошо, удалив сейчас. Я сделаю рекомендацию в отношении вашего ответа, когда мы закончим, так как вы поняли это прямо перед собой. – Tomalak