Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

mysql удаление несвязанных записей двух таблиц ()
Author Message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Aug 09, 2005 6:08 pm (написано за 2 минуты 31 секунду)
   Post subject: mysql удаление несвязанных записей двух таблиц
Reply with quote

Есть таблица А(id,foo), есть таблица B(id,idA,foo). Эти две таблицы связаны 1-ко-многим по полям А.id=B.idA. Задача: надо удалить из таблицы B те записи, для которых нет связанных записей в таблице А, то есть удалить "мертвые" записи из таблицы В.
Back to top
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Tue Aug 09, 2005 6:37 pm (спустя 28 минут; написано за 25 секунд)
   Post subject:
Reply with quote

Code (SQL): скопировать код в буфер обмена
DELETE b FROM b LEFT JOIN a ON b.ida = a.id WHERE a.id IS NULL;
Back to top
View user's profile Send private message Send e-mail
NoN
Участник форума



Joined: 26 Jul 2005
Posts: 98
Карма: -10
   поощрить/наказать

Location: SPB.RU

PostPosted: Tue Aug 09, 2005 7:16 pm (спустя 38 минут; написано за 1 минуту 36 секунд)
   Post subject:
Reply with quote

Многотабличное удаление работает в версии 4 и выше.
Запрос будет примерно таким:
Code (SQL): скопировать код в буфер обмена
DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id AND t2.id IS NULL
Хотя я никогда не пробовал эту штуку.

А для старый версий такое ИМХО не реализовать только на SQL.

(Попробовал через временную таблицу, но там опять упираемся в многотабличный del; хотел создать поле-флаг на удаление, но и у UPDATE нет многотабличности)

У меня получилось только так:
Code (SQL): скопировать код в буфер обмена
SELECT `id` FROM t1,t2 WHERE t1.id=t2.id AND t2.id IS NULL
А дальше удалить из таблицы записи полученых ключей.


PS Какой хирый вопрос! Найдёт кто-нибудь красивое решение?


Владимир Хоменко,
"DELETE b FROM b LEFT JOIN a ON b.ida = a.id WHERE a.id IS NULL;" - это не верно. Проверено.
Back to top
View user's profile Send private message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Tue Aug 09, 2005 7:40 pm (спустя 24 минуты; написано за 1 минуту 45 секунд)
   Post subject:
Reply with quote

NoN
А вы еще раз проверьте. Я запросы не с головы пишу и перед тем, как их запостить на форум, проверяю.
NoN wrote:
Code (SQL): скопировать код в буфер обмена
DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id AND t2.id IS NULL
И свой запрос проверьте, кстати.
Back to top
View user's profile Send private message Send e-mail
NoN
Участник форума



Joined: 26 Jul 2005
Posts: 98
Карма: -10
   поощрить/наказать

Location: SPB.RU

PostPosted: Tue Aug 09, 2005 8:06 pm (спустя 25 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Я свой скопировал с мануала и написал, что проверить не могу - версия старая (тройка). А после DELETE всяко "b" не может быть. Удалить таблицу из таблицы?
Back to top
View user's profile Send private message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Tue Aug 09, 2005 8:12 pm (спустя 5 минут; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

NoN

Специально для Вас залез в мануал и нашел там этот пример

Смотрите dev.mysql.com/doc/mysql/en/delete.html, самый нижний комментарий:
Quote:
I just successfully tried this to delete all records on table1 without the corresponding key on table2, without requiring a temporary table:

delete table1 from table1 left join table2 on table1.key = table2.key WHERE table2.key IS NULL;

It worked on mysql 4.1.13 (debian), not sure about older ones but i guess it's ok.
Почитайте синтаксис мульти-удаления таблиц, не спешите с резкими суждениями
Back to top
View user's profile Send private message Send e-mail
NoN
Участник форума



Joined: 26 Jul 2005
Posts: 98
Карма: -10
   поощрить/наказать

Location: SPB.RU

PostPosted: Tue Aug 09, 2005 9:55 pm (спустя 1 час 43 минуты; написано за 2 минуты 25 секунд)
   Post subject:
Reply with quote

Мне как-то бесполезно пока мультиудаление - всё ровно моя версия СУБД не поддерживает. Почитаю, но без опыта трудно разобраться.
В общем мы предложили варианты, теперь посмотрим сможет ли Гость воспользоваться Вашим. ;)
Back to top
View user's profile Send private message
Артeм Дивинcкий
Участник форума



Joined: 19 Jul 2005
Posts: 61
Карма: 6
   поощрить/наказать


PostPosted: Thu Aug 11, 2005 1:47 pm (спустя 1 день 15 часов 52 минуты; написано за 22 секунды)
   Post subject:
Reply with quote

NoN wrote:
А для старый версий такое ИМХО не реализовать только на SQL.
Настоящего извращенца ничто не остановит (-; :
Code (SQL): скопировать код в буфер обмена
  CREATE TEMPORARY TABLE t TYPE=HEAP
    SELECT b.* FROM b
      RIGHT JOIN a ON b.idA=a.id
    WHERE 1;

  DROP TABLE b;

  CREATE TABLE b
    SELECT * FROM t;
Back to top
View user's profile Send private message Send e-mail
Артeм Дивинcкий
Участник форума



Joined: 19 Jul 2005
Posts: 61
Карма: 6
   поощрить/наказать


PostPosted: Thu Aug 11, 2005 2:22 pm (спустя 34 минуты; написано за 3 минуты 39 секунд)
   Post subject:
Reply with quote

А вот более эффективный вариант, а то я, извините, с предидущим поспешил:
Code (SQL): скопировать код в буфер обмена
  CREATE TABLE t
    SELECT b.* FROM b
      RIGHT JOIN a ON b.idA=a.id
    WHERE 1;

  DROP TABLE b;

  ALTER TABLE t RENAME b;
Back to top
View user's profile Send private message Send e-mail
NoN
Участник форума



Joined: 26 Jul 2005
Posts: 98
Карма: -10
   поощрить/наказать

Location: SPB.RU

PostPosted: Thu Aug 11, 2005 7:21 pm (спустя 4 часа 58 минут; написано за 20 секунд)
   Post subject:
Reply with quote

:)
Ничего так. Только надо бы LOCK TABLE ещё добавить.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML