Операция "Удалить" в одной таблице
Мне нужно запросить оператор delete для той же таблицы на основе условий столбца из той же таблицы для коррелированного подзапроса.
Я не могу напрямую запустить инструкцию delete и проверить условие для той же таблицы в mysql для коррелированного подзапроса.
Я хочу знать, повлияет ли использование temp-таблицы на память/производительность mysql?
Любая помощь будет высоко оценена.
Спасибо.
Ответы
Ответ 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
Ответ 5
Вы имеете в виду что-то вроде:
DELETE FROM table WHERE someColumn = "someValue";
?
Это определенно возможно, читать о синтаксисе DELETE
в справочном руководстве.
Ответ 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