Подтвердить что ты не робот

Операция "Удалить" в одной таблице

Мне нужно запросить оператор delete для той же таблицы на основе условий столбца из той же таблицы для коррелированного подзапроса.

Я не могу напрямую запустить инструкцию delete и проверить условие для той же таблицы в mysql для коррелированного подзапроса.

Я хочу знать, повлияет ли использование temp-таблицы на память/производительность mysql?

Любая помощь будет высоко оценена.

Спасибо.

4b9b3361

Ответ 1

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

DELETE FROM document_revisions d1 WHERE edit_date < 
  (SELECT MAX(edit_date) FROM document_revisions d2 
   WHERE d2.document_id = d1.document_id);

Это проблема для MySQL.

Многие примеры этих типов проблем могут быть решены с использованием синтаксиса удаления нескольких таблиц MySQL:

DELETE d1 FROM document_revisions d1 JOIN document_revisions d2 
  ON d1.document_id = d2.document_id AND d1.edit_date < d2.edit_date;

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

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

Ответ 2

Вы можете заставить mysql выполнить временную таблицу для вас, обернув запрос "where" как встроенный из таблицы.

Этот исходный запрос даст вам страшный "Вы не можете указать целевую таблицу для обновления в предложении FROM":

DELETE FROM sametable
WHERE id IN (
    SELECT id FROM sametable WHERE stuff=true
)

Перезаписать его для использования встроенных темпов становится...

DELETE FROM sametable
WHERE id IN (
 SELECT implicitTemp.id from (SELECT id FROM sametable WHERE stuff=true) implicitTemp
)

Ответ 3

не может напрямую запустить инструкцию delete и проверить условие для той же таблицы

Конечно. Если вы хотите удалить из таблицы1 при проверке условия, что col1 = 'somevalue', вы можете сделать это:

DELETE
  FROM table1
 WHERE col1 = 'somevalue'

ИЗМЕНИТЬ
Чтобы удалить с помощью коррелированного подзапроса, см. Следующий пример:

create table project (id int);
create table emp_project (id int, project_id int);

insert into project values (1);
insert into project values (2);
insert into emp_project values (100, 1);
insert into emp_project values (200, 1);

/* Delete any project record that doesn't have associated emp_project records */
DELETE
  FROM project
 WHERE NOT EXISTS
     (SELECT *
        FROM emp_project e
       WHERE e.project_id = project.id);


/* project 2 doesn't have any emp_project records, so it was deleted, now
   we have 1 project record remaining */
SELECT * FROM project;

Result:
id
1

Ответ 4

Вы можете удалить из той же таблицы. Удалить оператор выглядит следующим образом

DELETE FROM table_name
WHERE some_column=some_value

Ответ 6

Создайте временную таблицу со значениями, которые вы хотите удалить, затем присоедините их к таблице при удалении. В этом примере у меня есть таблица "Игры" с столбцом ID. Я удалю ids больше 3. Сначала я соберу цели в таблице temp, чтобы позже сообщить об этом.

DECLARE @DeletedRows TABLE (ID int)

insert
    @DeletedRows
        (ID)
select
    ID
from
    Games
where
    ID > 3


DELETE
    Games
from
    Games g
join
    @DeletedRows x
    on x.ID = g.ID