Я выполняю SQL для базы данных MySQL и пытаюсь написать команды для удаления всех строк в таблице. Когда я запускаю «УДАЛИТЬ ИЗ MyTable», я получаю сообщение об ошибке 1175, потому что по умолчанию включена функция безопасности, которая заставляет вас указывать предложение WHERE в первичном ключе.
Я мог бы отключить эту функцию, но она мне нравится, поэтому я пытаюсь изменить свою команду, чтобы получить тот же эффект, добавив предложение WHERE. Итак, это работает:
DELETE FROM MyTable WHERE MyID > 0
При удалении всех строк больше, где MyID больше нуля, но я ищу действительно универсальный, который будет работать для любых значений MyID. я пробовал эти
DELETE FROM MyTable WHERE MyID = ANY
DELETE FROM MyTable WHERE MyID = *
Но это синтаксические ошибки. Документ в предложении WHERE говорит, что он просто принимает =, <,>,> =, <=, <>, BETWEEN, LIKE и IN, но ничего похожего на то, что он принимает что-либо.
Есть ли правильный синтаксис для условного выражения WHERE, которое принимает любое значение?
Спасибо.
@Стью, or MyID is NULL
Или, Where 1=1
или просто where 1=1
MyId
не может быть NULL, если это первичный ключ
@jarlh - Почему это всегда должно быть правдой?
Почему бы не обрезать?
@stu, верно. (Кажется, я недостаточно внимательно прочитал вопрос...) Тогда 1 = 1
тоже не работает.
Вроде не похоже MyID=MyID, все равно вылетает ошибка 1175
@PM77-1, добавь в Where MyId = MyId
. (Я не знал, что MyID не равен нулю.)
Я ищу по-настоящему универсальный, который будет работать для любых значений MyID, так как же > 0
не работает для любых значений, могут ли значения быть отрицательными?
@stu, нет, но я предполагаю, что они могут быть fred
, bill
, ..... просто интересно здесь вслух
@Stu, я пишу что-то вроде промежуточного программного обеспечения, так что да, пользователь моего кода может решить использовать отрицательные значения для первичного ключа.
@Chris, предполагая, что PK всегда является целочисленным / числовым типом, тогда >= -2147483647
также будет работать
Сделайте это составным условием.
WHERE id IS NULL OR id IS NOT NULL;
Опять же, может быть, условие безопасности существует по важной причине, которую вы не должны обходить стороной.
Поскольку MyID
является первичным ключом, NOT NULL
будет достаточно.
Странно, MyID = 100 работает, но MyID IS NOT NULL все равно выдает ошибку 1175.
IS NULL не срабатывает 1175, но IS NOT NULL срабатывает 1175. Довольно раздражает, так как я делаю намерение явным.
Использовать
TRUNCATE MyTable;
тогда вам не нужны никакие условия, так как у вас должны быть привилегии DELETE
TRUNCATE TABLE очищает таблицу. Для этого требуется привилегия DROP. Логически TRUNCATE TABLE похож на оператор DELETE, который удаляет все строки, или на последовательность операторов DROP TABLE и CREATE TABLE.
см. руководство
Ошибка связана с параметром клиента sql_safe_updates
(см. https://dev.mysql.com/doc/refman/8.0/en/mysql-tips.html#safe-updates).
Один из способов обойти режим безопасных обновлений — использовать в запросе предложение LIMIT
. Вы можете использовать любое значение, даже значение, намного превышающее количество строк в вашей таблице.
DELETE FROM MyTable LIMIT 9223372036854775807;
Вы также можете отключить безопасный режим обновлений, а затем запустить DELETE в обычном режиме:
SET sql_safe_updates=0;
DELETE FROM MyTable; -- returns no error
TRUNCATE TABLE — лучшее решение, если вы хотите удалить все строки.
Where MyId = MyId
?