2012-01-12 3 views
0

Следующая установка будет:Использование внешних ключей для удаления записей в нескольких таблицах

  • Позвольте мне удалить существующие записи
  • Предотвратить меня от создания новых записей в products

Это возможно происходит потому, что записи создаются в products до categories_products. Но я не могу создать записи в categories_products, прежде чем я узнаю идентификатор продукта.

Что вы хотите сделать?

ALTER TABLE products 
ADD CONSTRAINT FK_products 
FOREIGN KEY (id) REFERENCES categories_products(product_id) 
ON UPDATE CASCADE 
ON DELETE CASCADE; 

Столы

categories: 
id, name 

categories_products: 
category_id, product_id 

products: 
id, name 

Какой заказать каждый элемент получает создан

  1. Создать запись в категории
  2. Создайте запись в продукте
  3. U петь идентификаторы из 1. и 2. создать связь между categories и products

ответ

0

Я думаю, что у вас есть ограничение в обратном направлении. Это внешний ключ должен быть на categories_products таблицы и ссылки на products таблицу, а не наоборот:

ALTER TABLE categories_products 
ADD CONSTRAINT FK_products 
FOREIGN KEY (product_id) REFERENCES products(id) 
ON DELETE CASCADE; 
+0

Это работает. Но когда я пытаюсь удалить категорию, записи в «продуктах» и «category_products» все еще остаются. – Cudos

+0

@Cudos - вам нужно аналогичное ограничение на category_id для таблицы категорий. Но вы действительно не хотите удалять продукт, если категория удалена, хотя вы? –

+0

Почему нет? Если категория ушла, продукты также должны исчезнуть. – Cudos

0

У вас есть многие-ко-многим отношение:

  • Каждый продукт может иметь многие категории.
  • В каждой категории может быть много продуктов.

Итак, вы должны добавить два ключа для поддержки этого типа отношений. Эти иностранные должны быть добавлены в таблицу categories_products:

ALTER TABLE categories_products 
    ADD CONSTRAINT fk_products FOREIGN KEY (product_id) 
    REFERENCES products(id), 
    ADD CONSTRAINT fk_categories FOREIGN KEY (category_id) 
    REFERENCES categories(id); 

Затем, чтобы удалить категорию и связанные с ними продукты использовать запрос следующим образом:

SET FOREIGN_KEY_CHECKS = 0; 

DELETE c, cp, p 
    FROM category c 
    JOIN categories_products cp 
     ON cp.category_id = c.id 
    JOIN products p 
     ON p.id = cp.product_id 
WHERE 
    c.id = 100; 

SET FOREIGN_KEY_CHECKS = 1; 

Вы также можете добавить ON DELETE п КАСКАД, это поможет вам удалить строку из родительской таблицы и автоматически удалить соответствующие строки в дочерней таблице. Например, следующий запрос удалит автоматически связанные записи в categories_products таблица:

DELETE FROM category id = 100; 
Смежные вопросы