Код ошибки MySQL: 1175 во время ОБНОВЛЕНИЯ в MySQL Workbench


817

Я пытаюсь обновить столбец, visitedчтобы дать ему значение 1. Я использую рабочую среду MySQL, и я пишу оператор в редакторе SQL из рабочей среды. Я пишу следующую команду:

UPDATE tablename SET columnname=1;

Это дает мне следующую ошибку:

Вы используете безопасный режим обновления и пытались обновить таблицу без WHERE, в которой используется столбец KEY. Чтобы отключить безопасный режим, переключите параметр ....

Я следовал инструкциям, и мы отключили safe updateопцию из Editменю , а затем Preferencesзатем SQL Editor. Появляется та же ошибка, и я не могу обновить это значение. Пожалуйста, скажите мне, что не так?


4
Знаете ли вы, что это обновит все строки в вашей таблице, где посещено = 0, чтобы стать посещенным = 1? Это то, что вы хотите?
Марк Байерс

23
После снятия флажка «Безопасные обновления» выполните следующий шаг: Запрос -> Повторное подключение к серверу. Теперь выполните ваш запрос
Ripon Al Wasim

5
Вы должны повторно подключиться к MySQL Server (перезапустить соединение MySQL), прежде чем это изменение вступит в силу.
Филипп Олсон

Ответы:


1613

Похоже, в вашем сеансе MySql установлена опция безопасных обновлений . Это означает, что вы не можете обновить или удалить записи, не указав ключ (например primary key) в предложении where.

Пытаться:

SET SQL_SAFE_UPDATES = 0;

Или вы можете изменить свой запрос, чтобы следовать правилу (используйте primary keyв where clause).


Я упомянул, что уже отключил опцию безопасного обновления в графическом интерфейсе, которая имеет тот же эффект, что и идентификатор, введенный командой. Тем не менее, спасибо за ваш ответ, но я уже ответил на мой вопрос. Проверьте мой ответ, чтобы узнать, в чем была проблема.
Жюри

8
После того, как вы измените параметр в графическом интерфейсе, вам необходимо повторно подключиться к базе данных для правильной настройки.
Тим Косцельски

31
Обязательно установите это, SET SQL_SAFE_UPDATES = 1когда закончите, так как это полезная функция безопасности.
StockB

4
Я не согласен с StockB ... Возможно, вы захотите оставить его включенным, пока вы будете лучше использовать SQL ... но как только вы узнаете, что делаете ... эта вещь совершенно бесполезна. Вы все равно не должны разрабатывать свои вещи на производственном сервере, поэтому, даже если вы все испортите, единственное, что вам следует взломать, это ваш сервер разработки, о котором в любом случае никто не знает.
Матье Туркотт

3
я только пришел сказать, что я искал этот пост 20 раз за последние 6 месяцев, так как у меня всегда была эта опция false в течение 11 лет, но сейчас я работаю над компанией с таким набором true для разработки и производства. Есть много причин установить его по умолчанию на 0, например, когда вы разрабатываете автономные функции, которые вы можете экспортировать в csv напрямую, а затем пометьте его как экспортированный или что-то подобное. В других случаях это раздражает из-за глобальных обновлений, которые, очевидно, не имеют никакого pk-фильтра. Я вижу это скорее как защиту от нубов, чем как полезную функцию.
JoelBonetR

455

Выполните следующие шаги перед выполнением команды UPDATE: в MySQL Workbench

  1. Перейти к Edit->Preferences
  2. Нажмите "SQL Editor"вкладку и uncheck«Безопасные обновления»check box
  3. Query-> Reconnect to Server // выйти и затем войти
  4. Теперь выполните ваш запрос SQL

ps, нет необходимости перезапускать демон MySQL!


20
Для версии 6.3 шаг 2 должен быть "Sql Editor"вместо, "Sql Queries"а затем внизу есть флажок для"Safe Updates"
meconroy

1
если это разовая вещь, я предлагаю вам включить ее снова, так как это очень легко по-королевски испортить ваши данные, если вы не будете осторожны
Frankenmint

2
спасибо, Конрой. Некоторое время я не мог видеть эту коробку. Я просто должен был увеличить окно.
Арн-Арн

Может быть, они переместили его, но в MySQL Workbench 6.0 он находится в разделе «Запросы SQL», а не в «Редакторе SQL»
MPelletier

1
да здесь тоже самое, пришлось немного прокрутить вниз, чтобы увидеть это.
Элон Зито

167
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;

4
к сожалению, другие решения, основанные на запросах, у меня не сработали. Но этот сделал! Я ценю, что вы добавили строку, чтобы снова включить безопасные обновления.
SherylHohman

1
Мне действительно нравится этот, потому что он, вероятно, самый общий из всех, хотя все еще в безопасности.
Nae

117

Нет необходимости устанавливать SQL_SAFE_UPDATES в 0 , я бы очень не рекомендовал делать это таким образом. SAFE_UPDATES по умолчанию включен для ПРИЧИНЫ. Вы можете управлять автомобилем без ремней безопасности и прочего, если вы знаете, что я имею в виду;) Просто добавьте в предложение WHERE значение KEY, которое соответствует всему, как первичный ключ, по сравнению с 0, поэтому вместо записи:

UPDATE customers SET countryCode = 'USA'
    WHERE country = 'USA';               -- which gives the error, you just write:

UPDATE customers SET countryCode = 'USA'
    WHERE (country = 'USA' AND customerNumber <> 0); -- Because customerNumber is a primary key you got no error 1175 any more.

Теперь вы можете быть уверены, что каждая запись (ВСЕГДА) обновляется, как вы ожидаете.


3
Это гений!
Амос Лонг,

оценил ответ: +1
Асиф Раза

2
Ха-ха, это хороший трюк. Я использовал WHERE id > 0как трюк в этом направлении.
Чаба Тот

Это не работает для меня, оно продолжает показывать мне то же сообщение. Я решил это, деактивировав безопасный режим обновления с помощью: -Edit -> Preferences -> Sql Editor, затем снимите флажок Safe update.
Абдельхади Лахлоу

2
Как это на самом деле делает это хоть немного безопаснее?
Мэтт Мессерсмит

107

Все, что нужно, это: Запустить новый запрос и выполнить:

SET SQL_SAFE_UPDATES = 0;

Затем: Запустите запрос, который вы пытались выполнить, который ранее не работал.


7
Добро пожаловать в SO, обязательно прочитайте страницу тура и справку и избегайте публикации ответов, подобных этому, потому что многие ответы ниже этого говорят о том же самом и были опубликованы несколько месяцев назад
WOUNDEDStevenJones

1
Вы также можете снова включить эту опцию после выполнения запроса.
августа

Что добавляет этот ответ? Вы только что опубликовали то же самое, что и Хабибилла, более двух лет спустя. Пытаетесь пожинать карму?
Люк


67

Код ошибки: 1175. Вы используете безопасный режим обновления и пытаетесь обновить таблицу без WHERE, в которой используется столбец KEY. Чтобы отключить безопасный режим, выберите параметр в «Предпочтения» -> «Редактор SQL» и повторно подключитесь.

Выключите «Безопасный режим обновления» временно

SET SQL_SAFE_UPDATES = 0;
UPDATE options SET title= 'kiemvieclam24h' WHERE url = 'http://kiemvieclam24h.net';
SET SQL_SAFE_UPDATES = 1;

Выключите «Безопасный режим обновления» навсегда

Mysql Workbench 8.0:

MySQL Workbench => [ Edit ] => [ Preferences ] -> [ SQL Editor ] -> Uncheck "Safe Updates"

введите описание изображения здесь Старая версия может:

MySQL Workbench => [Edit] => [Preferences] => [SQL Queries]

41
  1. Настройки ...
  2. «Безопасные обновления» ...
  3. Перезагрузите сервер

Настройки ...

Безопасные обновления Перезагрузите сервер


Это должен был быть принятый ответ. Жаль, что его не было
ErrorrrDetector

1
Вам не нужно перезагружать сервер. Этого должно быть достаточно, чтобы просто закрыть и снова открыть соединение.
Марк Л.

1
В MAC настройки находятся в верхнем меню MySQLWorkbench.
цвиттерион

36
SET SQL_SAFE_UPDATES=0;

ИЛИ

Перейти к Edit --> Preferences

Нажмите SQL Queries вкладку и снимите Safe Updates флажок

Query --> Reconnect to Server

Теперь выполните ваш sql запрос


26

Если вы находитесь в безопасном режиме, вам нужно указать идентификатор в предложении where. Так что-то вроде этого должно работать!

UPDATE tablename SET columnname=1 where id>0

1
Эта страница подтверждает этот факт: bennadel.com/blog/...
DivDiff

21

В WorkBench я решил эту проблему, отключив безопасный режим обновления:

-Edit -> Настройки -> Sql Editor, затем снимите флажок Безопасное обновление.


7
Это работает, но мне пришлось перезапустить MySQL Workbench.
Ланил Марасинге

17

Я нашел ответ. Проблема заключалась в том, что я должен предшествовать имени таблицы с именем схемы. т.е. команда должна быть:

UPDATE schemaname.tablename SET columnname=1;

Спасибо всем.


5
Вы можете избежать упоминания имени схемы, выбрав схему на левой панели. Выбор схемы на левой панели означает, что вы используете выбранную схему / базу данных
Ripon Al Wasim

10
Это не ответ для решения проблемы, описанной в вопросе (и заголовке). Вы должны пометить другого как принятого.
T30

Я пытался использовать имя схемы, но получаю ту же ошибку, обновите qms-active-db.gh_table set bookmark = '1660_207100000001000'
Code_Mode

3
Это не ответ!
Иезекииль Виктор

1
неправильный ответ, на правильный ответ отвечает Хабибилла (ниже)
hariharan s

14

В версии MySQL Workbech 6.2 не выходите из предпочтенияSQLQueries параметров .

В этом случае возможно использование: SET SQL_SAFE_UPDATES=0;


1
Он существует, но опция находится в разделе «Редактор SQL».
Филипп Олсон

Я не вижу этот вариант. Пожалуйста, вы можете получить скриншот. Спасибо
ferdiado

Откройте Настройки -> вкладка Редактор SQL -> Внизу. В версии 6.2-бета эта опция отсутствовала, поэтому, возможно, вам потребуется обновить ее до 6.2.3+.
Филипп Олсон

моя версия 6.3, она под -> Редактор SQL -> Другое
тян

12

Самое простое решение - определить предел строки и выполнить. Это сделано в целях безопасности.


2
+1 на это решение. Удалить из ТАБЛИЦЫ, где column = предел xyz 9999999999
FlyingZebra1

2
Этот ответ должен быть принятым, потому что это наименее небезопасный путь.
Джулиан

7

Поскольку на вопрос был дан ответ, и он не имел ничего общего с безопасными обновлениями, это может быть неправильное место; Я выложу просто чтобы добавить информацию.

Я пытался быть хорошим гражданином и изменил запрос, чтобы использовать временную таблицу идентификаторов, которая будет обновлена:

create temporary table ids ( id int )
    select id from prime_table where condition = true;
update prime_table set field1 = '' where id in (select id from ids);

Провал. Изменено обновление для:

update prime_table set field1 = '' where id <> 0 and id in (select id from ids);

Это сработало. Хорошо, если я всегда добавляю где ключ <> 0, чтобы обойти безопасную проверку обновлений, или даже устанавливаю SQL_SAFE_UPDATE = 0, то я потерял «проверку» в моем запросе. Я мог бы просто отключить опцию навсегда. Я полагаю, это приводит к удалению и обновлению двухэтапного процесса вместо одного ... но если вы наберете достаточно быстро и перестанете думать о том, что ключ особенный, а не просто неприятность ...


4

Правда, это бессмысленно для большинства примеров. Но, наконец, я пришел к следующему утверждению, и оно отлично работает:

update tablename  set column1 = '' where tablename .id = (select id from tablename2 where tablename2.column2 = 'xyz');

3

Это для Mac, но должно быть одинаковым для других ОС, за исключением расположения настроек.

Ошибка, которую мы получаем при попытке небезопасной DELETEоперации

Нажмите на настройки, когда вы получите эту ошибку

В новом окне снимите флажок Safe updates

Снимите флажки с безопасных обновлений

Затем закройте и снова откройте соединение. Нет необходимости перезапускать сервис.

Теперь мы собираемся попробовать еще DELETEраз с успешными результатами.

введите описание изображения здесь

Так что же это за безопасные обновления? Это не злая вещь. Это то, что MySql говорит об этом.

Используя --safe-updatesопцию

Для новичков полезной опцией запуска является --safe-updates(или --i-am-a-dummy, которая имеет тот же эффект). Это полезно в тех случаях, когда вы могли сделать DELETE FROM tbl_nameзаявление, но забыли его WHERE. Обычно такой оператор удаляет все строки из таблицы. С помощью --safe-updatesвы можете удалять строки только указав ключевые значения, которые их идентифицируют. Это помогает предотвратить несчастные случаи.

Когда вы используете эту --safe-updatesопцию, mysql выдает следующий оператор при подключении к серверу MySQL:

SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;

Можно безопасно включить эту опцию, когда вы работаете с производственной базой данных. В противном случае вы должны быть очень осторожны, чтобы случайно не удалить важные данные.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.