Консультация № 169964
28.06.2009, 12:41
0.00 руб.
07.11.2009, 14:36
0 7 2
Здравствуйте.
Скажите пожалуйста какой sql запрос надо составить ,что бы удалить из двух таблиц данные из одной таблицы данные которые старше 5-ти дней () , из другой все данные id которых совпали с удалёнными id из первой таблицы ?
Спасибо.

Обсуждение

Неизвестный
28.06.2009, 13:26
общий
Вот поля таблицы:
------------------------------------
табл.1

id1 | date

табл.2
id2 | id_table1
-----------------------------------
Если поле id_table1 == id1 то его надо удалять
Неизвестный
28.06.2009, 14:07
общий
это ответ
Здравствуйте, Dima1967.
В одном запросе наверно не получится.
1. Удалить все записи во второй таблице, в которой есть соответствие по ID записям из первой таблице отобранным по условию
2. Удалить все записи по условию из первой таблице.

DELETE FROM TABLE2
WHERE ID_TABLE1 IN (SELECT ID1 FROM TABLE1 WHERE DATE < (SYSDATE-5))

DELETE FROM TABLE1
WHERE DATE < (SYSDATE -5)
-------------------------------------------
Для разных СУБД, по разному происходит обработка дат.. Например, это может быть DATEADD(DD,-5,GETDATE()) и т.д.

А вообще, это называется «ссылочная целостность». Для этого, надо просто определить зависимость этих таблиц с помощью ссылочных ключей (по полю ID_TABLE1 → ID1) связи «один ко многим» с правилом каскадного удаления. Тогда, достаточно будет просто удалить записи в первой таблице, и автоматически удалятся записи в зависимых таблицах.
5
давно
Академик
320937
2216
28.06.2009, 14:55
общий
это ответ
Здравствуйте, Dima1967. Предлагается установить внешний ключ (если его нет) от таблицы t2 (id_table1) к таблице t1(id1), с каскадным удалением.
После этого выполнить запрос.
Один из вариантов в Firebird 2.1 приведен в приложении.


Приложение:
/*
create domain t_id as integer not null;
create table t1(
id1 t_id,
d date
);
alter table t1 add constraint t1_pk primary key (id1 );

create table t2(
id2 t_id,
id_table1 t_id
);
alter table t2 add constraint t2_pk primary key (id2 );
*/


alter table t2 add constraint FK_T2_1 foreign key (ID_TABLE1)
references T1(ID1) on delete CASCADE;

delete
from t1
where (cast('TODAY' as date) - t1.d)>5
5
Неизвестный
28.06.2009, 19:35
общий
"...Для этого, надо просто определить зависимость этих таблиц с помощью ссылочных ключей (по полю ID_TABLE1 → ID1) связи «один ко многим» с правилом каскадного удаления. Тогда, достаточно будет просто удалить записи в первой таблице, и автоматически удалятся записи в зависимых таблицах. ...." Записи из второй таблицы не удаляются - я удалял просто по id не по датам , у меня mysql , апач.
Неизвестный
28.06.2009, 20:11
общий
Dima1967:
myqsl позволяет это реализовать, так же как и процедуры, фнукции и т.д. Просто, тип таблиц нужен не MyISAM а InnoDB но для WEB, наверно лучше MyISAM (хотя.. спорно). Версия MySQL в этом случае лучше >= 5.
Иначе, так как я показала в запросе.
Неизвестный
28.06.2009, 21:09
общий
Я поменял тип таблиц, версия 5.0.51a но всё равно по ключу из двух таблиц удалять не хочет - я давно хотел разобраться с внешними ключами , говорят ,что с ними запросы работают быстрей . Эти запросы :

DELETE FROM TABLE2
WHERE ID_TABLE1 IN (SELECT ID1 FROM TABLE1 WHERE DATE < (SYSDATE-5))

DELETE FROM TABLE1
WHERE DATE < (SYSDATE -5)

работают хорошо, Спасибо .
Неизвестный
30.06.2009, 02:06
общий
Цитата: 255090
Эти запросы :

DELETE FROM TABLE2
WHERE ID_TABLE1 IN (SELECT ID1 FROM TABLE1 WHERE DATE < (SYSDATE-5))

DELETE FROM TABLE1
WHERE DATE < (SYSDATE -5)

работают хорошо


Лучше все же объявить ID_TABLE1 как FOREIGN KEY и использовать каскадное удаление. Иначе (если эти два запроса не выполняются в рамках одной транзакции) возможна ситуация, когда после выполнения 1-го в TABLE2 будут добавлены записи, ссылающиеся на записи из TABLE1, удаляемые вторым запросом -> будет нарушена справочная целостность.
Форма ответа