#mysql #sql
#mysql #sql
Вопрос:
я должен выбрать неиспользуемые элементы из таблицы, переместить эти элементы с другой информацией в используемую таблицу, которая будет вызвана useditems
. пока элементы окончательно перемещены, я должен удалить эти элементы из неиспользуемой таблицы.
итак, я записал следующий запрос.
INSERT INTO USED select KNumber from unused limit 1000;
DELETE FROM unused limit 1000;
моя единственная проблема заключается в том, что он всегда выбирает одну и ту же запись, поскольку я не использую какой-либо порядок в запросе, а в таблице у меня только один столбец. таким образом, будут удалены только вставленные записи.
я новичок в mysql.
Ответ №1:
Вместо этого используйте order by
предложение с limit
предложением, чтобы убедиться, что одинаковый набор записей и ограничение без порядка по не будет иметь особого смысла, потому что только с limit вы можете в конечном итоге вставить / удалить разные данные, тогда как ваша цель — удалить тот же набор данных, который вы вставляете.
INSERT INTO USED select KNumber from unused order by KNumber limit 1000;
DELETE FROM unused order by KNumber limit 1000;
Комментарии:
1. у меня есть только один столбец в обеих таблицах, который является символьным типом. поэтому я сомневаюсь, что если я использовал order к тому времени, это наверняка замедлит мой полный запрос.
2. @rahularyansharma, это зависит от количества строк и того, есть ли в этом столбце индекс или нет. Я не думаю, что ваша скорость будет скомпрометирована. Более того, вы будете уверены, что удаляются те же записи, которые также вставлены. попробуйте и убедитесь сами.
3. @Downvoter, не просто голосуйте против, дайте людям знать причину.
4. Использование order by — единственный способ сохранить целостность данных. Не имеет значения, выполняется ли запрос медленнее, его неиспользование — это путь к катастрофе, поскольку базы данных не гарантируют, что когда-либо будут возвращать записи в определенном порядке, даже в том порядке, в котором они хранятся. Если поле не проиндексировано, оно должно быть.
Ответ №2:
Чтобы быть уверенным в подходе, вы можете удалить те записи, которые вы уже поместили в ИСПОЛЬЗУЕМУЮ таблицу:
Delete from Unused
where kNumber in (
select distinct kNumber from Used
)
Комментарии:
1. у используемого уже есть много записей, и у него есть только один столбец.
2. Но, как я понял, запись не может быть в обеих таблицах. Как только он будет вставлен в таблицу «USED», его следует удалить из «неиспользуемого». Итак, приведенный выше код (который выполняется после вашего оператора select) работает. Верно?
Ответ №3:
Напишите insert
триггер Used
, который удаляет из Unused
на основе вставляемых данных.
drop trigger if exists used_ai;
delimiter //
CREATE trigger used_ai after insert on used
for each row
begin
delete from Unused where kNumber = New.kNumber;
end//
delimiter ;