ограничит работу одинаково для обоих условий в инструкции select и delete

#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 ;