У меня есть инструктор по таблицам, и я хочу удалить записи с диапазоном зарплаты. Интуитивно понятный способ выглядит так:
delete from instructor where salary between 13000 and 15000;
Однако в безопасном режиме я не могу удалить запись, не предоставив первичный ключ (ID).
Итак, я пишу следующий sql:
delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
Однако есть ошибка:
You can't specify target table 'instructor' for update in FROM clause
Я запутался, потому что когда я пишу
select * from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
это не вызывает ошибки.
У меня вопрос:
- что на самом деле означает это сообщение об ошибке и почему мой код неверен?
- как переписать этот код, чтобы он работал в безопасном режиме?
Благодарность!
Ответы:
Погуглив, популярный ответ, кажется, "просто выключи безопасный режим" :
SET SQL_SAFE_UPDATES = 0; DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000; SET SQL_SAFE_UPDATES = 1;
Если честно, я не могу сказать, что когда-либо имел привычку бегать в безопасном режиме. Тем не менее, мне не совсем удобен этот ответ, поскольку он просто предполагает, что вы должны менять конфигурацию своей базы данных каждый раз, когда сталкиваетесь с проблемой.
Итак, ваш второй запрос ближе к цели, но сталкивается с другой проблемой: MySQL применяет несколько ограничений к подзапросам, и одно из них заключается в том, что вы не можете изменять таблицу, выбирая из нее в подзапросе.
Цитата из руководства MySQL, Ограничения на подзапросы :
Последнее - ваш ответ. Выберите целевые идентификаторы во временной таблице, затем удалите их, указав идентификаторы в этой таблице:
DELETE FROM instructor WHERE id IN ( SELECT temp.id FROM ( SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000 ) AS temp );
Демонстрация SQLFiddle .
источник
ID
, в то время как в моем ответе используетсяid
.Вы можете обмануть MySQL, заставив думать, что вы на самом деле указываете столбец первичного ключа. Это позволяет вам «переопределить» безопасный режим.
Предполагая, что у вас есть таблица с автоматически увеличивающимся числовым первичным ключом, вы можете сделать следующее:
DELETE FROM tbl WHERE id <> 0
источник
Отключение безопасного режима в Mysql Workbench 6.3.4.0
Меню Правка => Настройки => Редактор SQL: Другой раздел: нажмите «Безопасные обновления» ..., чтобы снять флажок
источник
У меня есть гораздо более простое решение, оно работает для меня; это также обходной путь, но его можно использовать, и вам не нужно менять настройки. Я предполагаю, что вы можете использовать значение, которого никогда не будет, затем вы используете его в своем предложении WHERE
УДАЛИТЬ ИЗ MyTable, ГДЕ MyField IS_NOT_EQUAL AnyValueNoItemOnMyFieldWillEverHave
Мне тоже не очень нравится это решение, поэтому я здесь, но оно работает и кажется лучше, чем то, что на него ответили.
источник