#mysql #sql-delete
#mysql #sql-удалить
Вопрос:
Я скопировал некоторые записи из одной таблицы в другую с помощью этого запроса :
insert into pages_finished (keyword,pages,resultlist,done,current)
select keyword,pages,resultlist,done,current
from pages_done o
where (select count(*) as totalPages from pages_done x where x.keyword = o.keyword)-1 = pages
Теперь я хочу удалить те же записи из исходной таблицы,
Я думал, что это будет просто, как:
delete from pages_done o
where (select count(*) as totalPages from pages_done x where x.keyword = o.keyword)-1 = pages
но это не работает.
Кто-нибудь может сказать мне, как правильно это сделать?
После ответа @ bgdrl я подумываю о запуске только select, получении идентификаторов всех записей, которые следует скопировать, а затем удалении; но я думаю, что должно быть более простое решение, кто-нибудь?
Хотя ответ @bgdrl отмечен как правильный, это только из-за этого факта.
Для всех, кому интересно, что я в итоге сделал: я сделал тот же select, с которого начал (но выбрал только столбец id, поскольку выбор всех столбцов убил бы мой бедный компьютер), экспортировал его в INSERT STATMENTS
(используя mysqlworkbench), открыл текстовый файл в блокноте, заменил все INSERT INTO
… с помощью DELETE FROM WHERE ID=
и запустите этот запрос в mysql.
Я чувствую себя таким глупым, используя этот способ, но, по-видимому, другого выбора не было.
Комментарии:
1. почему вы не справились с этим с помощью mysql
LAST_INSERT_ID()
2. @diEcho, потому что
LAST_INSERT_ID()
возвращает только одно значение, в то время как оператор INSERT может вставлять много строк.
Ответ №1:
С сайта mysql: «Вы не можете изменять таблицу и выбирать из той же таблицы в подзапросе. Это относится к таким операторам, как DELETE, INSERT, REPLACE, UPDATE». http://dev.mysql.com/doc/refman/5.1/en/subqueries.html
Комментарии:
1. хорошо, bgdrl, это здорово знать, но мне все еще нужно решение. у кого-нибудь есть идея, как подойти к этому?
2. зачем вам это условие? где x.ключевое слово = o.ключевое слово)-1 = страницы. Что вы пытаетесь отфильтровать?
3. в основном он сравнивает общее количество строк для определенного ключевого слова и сравнивает его со столбцом pages, который должен совпадать. значение -1 связано с тем, что строки содержат также номер страницы 0.
Ответ №2:
ПОЖАЛУЙСТА, СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ ТАБЛИЦЫ, прежде чем СЛЕДОВАТЬ ИНСТРУКЦИЯМ.
Выполните следующие ШАГИ
ШАГ 1
CREATE TABLE pages_done_ids
SELECT o.id FROM pages_done AS o
WHERE
(
SELECT count(*) AS totalPages
FROM pages_done AS x
WHERE x.keyword = o.keyword
)-1 = o.pages
ШАГ 2
DELETE FROM pages_done AS o
WHERE o.id IN (SELECT id FROM pages_done_ids)
ШАГ 3
DROP TABLE pages_done_ids;
Хорошо, вы можете выполнить это с помощью одной транзакции, используя ВРЕМЕННЫЕ ТАБЛИЦЫ.
Удачных запросов!
Комментарии:
1. Это выглядит как отличная идея!
2. Проверьте SQL, просто написал его вслепую.
3. с небольшой модификацией это было то, что мне было нужно 🙂 спасибо!