Удалите строки из двух таблиц в одном запросе

Соответствие RFC 2616 в разделе 9.5 (POST) позволяет кэширование ответ к сообщению POST при использовании соответствующих заголовков.

Ответы на этот метод не являются кэшируемыми, если ответ не включает соответствующее Управление Кэша или Истекает поля заголовка. Однако 303 (См. Другой) ответ могут использоваться для направления агента пользователя для получения кэшируемого ресурса.

Примечание, которое тот же RFC указывает явно в разделе 13 (Кэширующийся в HTTP), что кэш должен делать недействительным соответствующий объект после запроса POST .

Некоторые методы HTTP ДОЛЖНЫ заставить кэш делать недействительным объект. Это - или объект, упомянутый URI запроса, или заголовками Местоположения или Довольного Местоположения (если есть). Эти методы:

  - PUT
  - DELETE
  - POST

мне не ясно, как эти спецификации могут позволить значимое кэширование.

7
задан Josh Davis 27 August 2009 в 12:31
поделиться

6 ответов

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

Этот пример взят из руководства MySQL :

CREATE TABLE parent(
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child(
    id INT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;

Обратите внимание, что движок это InnoDB.

8
ответ дан 6 December 2019 в 06:50
поделиться

Это зависит от вашей СУБД, но в основном то, что вам нужно, звучит так, как будто вы хотите, чтобы одна таблица ссылалась на другую, используя ИНОСТРАННЫЙ КЛЮЧ с ПРИ КАСКАДЕ УДАЛЕНИЯ ], а затем удаление из родительской таблицы автоматически удалит соответствующие строки из зависимых таблиц.

3
ответ дан 6 December 2019 в 06:50
поделиться

Вот простое решение, если вы используете MySQL / PgSQL ...

DELETE t1, t2 FROM table1 AS t1 
LEFT JOIN table2 AS t2 USING( orderID ) 
WHERE t1.orderID = 500;

Гарантированно работает как шарм!

Не забудьте заменить table1 и table2 соответствующими именами таблиц в вашем случае.

Я использовал много этого запроса в своей специально разработанной CMS - везде, где я ' я хотел избежать двух отдельных атомарных запросов. Это так же хорошо, как и каскадное удаление, и запрос может быть расширен, чтобы охватить любое количество таблиц.

Вот еще один пример с тремя таблицами:

DELETE t1, t2, t3 FROM table1 AS t1 
LEFT JOIN table2 AS t2 USING( orderID ) 
LEFT JOIN table3 AS t3 USING( orderID ) 
WHERE t1.orderID = 500;

Ура, m ^ e

2
ответ дан 6 December 2019 в 06:50
поделиться

Не могли бы вы использовать сохраненную функцию и вызвать ее?

А затем внутри сохраненной функции у вас будут оба запроса DELETE. Затем, когда вызывается сохраненная функция, она запускается как транзакция, и вы можете заставить ее возвращать все, что захотите.

1
ответ дан 6 December 2019 в 06:50
поделиться

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

В качестве альтернативы вы можете использовать триггеры. Они работают с любым механизмом хранения, и обычно их достаточно легко написать. Мне они нравятся, но они не очень производительны, если вы удаляете большое количество строк одновременно (несколько сотен или тысяч).

CREATE TRIGGER ad_orders AFTER DELETE ON orders
FOR EACH ROW DELETE FROM orders_items WHERE orderID = OLD.orderID;

Наконец, как было предложено в предыдущем ответе, вы можете использовать многотабличное DELETE:

DELETE o, oi
FROM orders o
LEFT JOIN orders_items oi USING (orderID)
WHERE o.orderID = 500;
2
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

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