Kod błędu MySQL: 1175 podczas aktualizacji w MySQL Workbench

816

Próbuję zaktualizować kolumnę, visitedaby nadała jej wartość 1. Korzystam ze środowiska roboczego MySQL i piszę instrukcję w edytorze SQL z poziomu środowiska roboczego. Piszę następujące polecenie:

UPDATE tablename SET columnname=1;

Daje mi następujący błąd:

Używasz trybu bezpiecznej aktualizacji i próbowałeś zaktualizować tabelę bez GDZIE, który używa kolumny KLUCZ Aby wyłączyć tryb awaryjny, przełącz opcję ....

I przestrzegać instrukcji, a ja niezaznaczone na safe updateopcję z Editmenu, a następnie Preferencespotem SQL Editor. Nadal pojawia się ten sam błąd i nie mogę zaktualizować tej wartości. Powiedz mi, co jest nie tak?

Jury A.
źródło
4
Czy wiesz, że spowoduje to zaktualizowanie wszystkich wierszy w tabeli, w której odwiedzono = 0, aby zostać odwiedzonym = 1? Czy to jest to, czego chcesz?
Mark Byers
23
Po odznaczeniu „Bezpiecznych aktualizacji” wykonaj następujący krok: Zapytanie -> Połącz ponownie z serwerem. Teraz wykonaj zapytanie
Ripon Al Wasim
5
Musisz ponownie połączyć się z serwerem MySQL (zrestartować połączenie MySQL), zanim zmiana zacznie obowiązywać.
Philip Olson

Odpowiedzi:

1611

Wygląda na to, że twoja sesja MySql ma ustawioną opcję bezpiecznych aktualizacji . Oznacza to, że nie można aktualizować ani usuwać rekordów bez podania klucza (np. primary key) W klauzuli where.

Próbować:

SET SQL_SAFE_UPDATES = 0;

Lub możesz zmodyfikować zapytanie, aby postępować zgodnie z regułą (użyj primary keyw where clause).

Habibillah
źródło
Wspomniałem, że już wyłączyłem opcję bezpiecznej aktualizacji z GUI, które mają taki sam efekt jak id, wpisałem polecenie. Jednak dziękuję za odpowiedź, ale już odpowiedziałem na moje pytanie. Sprawdź moją odpowiedź, aby dowiedzieć się, na czym polegał problem.
Jury A
8
Po zmianie opcji w graficznym interfejsie użytkownika należy ponownie połączyć się z bazą danych, aby ustawienie zostało ustawione poprawnie.
Tim Koscielski
31
Pamiętaj, aby cofnąć SET SQL_SAFE_UPDATES = 1to po zakończeniu, ponieważ jest to cenna funkcja bezpieczeństwa.
StockB
4
Nie zgadzam się z StockB ... Możesz chcieć to kontynuować, dopóki będziesz lepiej posługiwać się SQLem ... ale kiedy już wiesz, co robisz ... ta rzecz jest całkowicie bezużyteczna. I tak nie powinieneś rozwijać swoich rzeczy na serwerze produkcyjnym, więc nawet jeśli się popsujesz, jedyną rzeczą, którą powinieneś zepsuć, jest serwer deweloperów ... o którym i tak nikt nie dba.
Mathieu Turcotte
3
Przyszedłem tylko powiedzieć, że szukałem tego postu około 20 razy w ciągu ostatnich 6 miesięcy, ponieważ zawsze miałem tę opcję fałszywki przez 11 lat, ale teraz pracuję nad firmą z takim zestawem prawdy w zakresie rozwoju i produkcji. Istnieje wiele powodów, aby ustawić ją domyślnie na 0, na przykład podczas opracowywania samodzielnych funkcji, które możesz chcieć wyeksportować bezpośrednio do csv, a następnie oznaczyć jako wyeksportowane lub coś podobnego. Innym razem jest to denerwujące ze względu na globalne aktualizacje, które oczywiście nie mają żadnego filtra pk. Widzę to bardziej jako ochronę przed Noobem niż naprawdę przydatną funkcję.
JoelBonetR
454

Przed wykonaniem polecenia UPDATE wykonaj następujące kroki: W MySQL Workbench

  1. Idź do Edit->Preferences
  2. Kliknij "SQL Editor"kartę i uncheck„Bezpieczne aktualizacje”check box
  3. Query-> Reconnect to Server // wyloguj się, a następnie zaloguj
  4. Teraz wykonaj zapytanie SQL

ps, nie ma potrzeby restartowania demona MySQL!

Ripon Al Wasim
źródło
20
W przypadku wersji 6.3 krok 2 powinien być "Sql Editor"zamiast, "Sql Queries"a następnie u dołu znajduje się pole wyboru"Safe Updates"
meconroy
1
jeśli jest to jednorazowa rzecz, sugeruję, aby włączyć ją ponownie, ponieważ dzięki temu bardzo łatwo można po królewsku zlikwidować dane, jeśli nie jesteś ostrożny
Frankenmint
2
dzięki conroy. Przez jakiś czas nie widziałem tego pudełka. Musiałem tylko powiększyć okno.
arn-arn
Może przenieśli go, ale w MySQL Workbench 6.0 jest pod „Zapytaniami SQL”, a nie „Edytorem SQL”
MPelletier
1
tak samo tutaj, musiałem trochę przewinąć w dół, aby to zobaczyć.
Elon Zito
167
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;
użytkownik2531028
źródło
4
niestety inne rozwiązania oparte na zapytaniach nie działały dla mnie. Ale ten zrobił! Rozumiem, że dodałeś linię, aby ponownie włączyć bezpieczne aktualizacje.
SherylHohman,
1
Naprawdę podoba mi się ten, ponieważ jest to prawdopodobnie najbardziej ogólny ze względu na bezpieczeństwo.
Nae
117

Nie ma potrzeby ustawiania SQL_SAFE_UPDATES na 0 , naprawdę odradzałbym to, aby zrobić to w ten sposób. SAFE_UPDATES jest domyślnie włączone dla POWODU. Możesz prowadzić samochód bez pasów bezpieczeństwa i innych rzeczy, jeśli wiesz, co mam na myśli;) Po prostu dodaj w klauzuli WHERE wartość KLUCZ, która pasuje do wszystkiego jak klucz podstawowy w porównaniu do 0, więc zamiast pisać:

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.

Teraz możesz mieć pewność, że każdy rekord jest (ZAWSZE) aktualizowany zgodnie z oczekiwaniami.

Rudy De Volder
źródło
3
To jest genialne!
Amos Long,
docenia odpowiedź: +1
Asif Raza
2
Haha, to dobra sztuczka. Użyłem WHERE id > 0jako podstęp w tej linii.
Csaba Toth
To nie działa dla mnie, nadal pokazuje mi tę samą wiadomość. Rozwiązałem go, dezaktywując tryb bezpiecznej aktualizacji przez: -Edycja -> Preferencje -> Edytor SQL, a następnie odznacz Bezpieczną aktualizację.
Abdelhadi Lahlou,
2
Jak to jednak sprawia, że ​​jest on bezpieczniejszy?
Matt Messersmith,
106

Wszystko, czego potrzeba to: Rozpocznij nowe zapytanie i uruchom:

SET SQL_SAFE_UPDATES = 0;

Następnie: Uruchom zapytanie, które próbujesz uruchomić, które wcześniej nie działało.

Quagmire12
źródło
7
Witamy w SO, koniecznie przeczytaj stronę przewodnika i stronę pomocy i unikaj zamieszczania odpowiedzi takich jak ta, ponieważ wiele odpowiedzi poniżej tej odpowiedzi mówi dokładnie to samo i zostało opublikowanych kilka miesięcy temu
WOUNDEDStevenJones
1
Możesz również włączyć tę opcję ponownie po uruchomieniu zapytania.
kta
Co dodaje ta odpowiedź? Właśnie opublikowałeś to samo co Habibillah, ponad dwa lata później. Próbujesz zbierać karmę?
Luc
70

ZESTAW SQL_SAFE_UPDATES = 0;

Twój kod SQL tutaj

ZESTAW SQL_SAFE_UPDATES = 1;

Carlos Henrique Moreira Dos S.
źródło
66

Kod błędu: 1175. Używasz trybu bezpiecznej aktualizacji i próbowałeś zaktualizować tabelę bez GDZIE, który używa kolumny KLUCZ. Aby wyłączyć tryb awaryjny, przełącz opcję w Preferencjach -> Edytor SQL i połącz ponownie.

Wyłącz tymczasowo „Tryb bezpiecznej aktualizacji”

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

Na zawsze wyłącz „Tryb bezpiecznej aktualizacji”

Mysql workbench 8.0:

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

wprowadź opis zdjęcia tutaj Stara wersja może:

MySQL Workbench => [Edit] => [Preferences] => [SQL Queries]
Tính Ngô Quang
źródło
41
  1. Preferencje...
  2. „Bezpieczne aktualizacje” ...
  3. Uruchom ponownie serwer

Preferencje...

Bezpieczne aktualizacje Uruchom ponownie serwer

Andrzej
źródło
To powinna być zaakceptowana odpowiedź. Szkoda, że ​​tak nie było
ErrorrrDetector
1
Nie powinieneś ponownie uruchamiać serwera. Wystarczy po prostu zamknąć i ponownie otworzyć połączenie.
Marc L.
1
W MAC preferencje znajdują się w górnym menu MySQLWorkbench.
zwitterion
36
SET SQL_SAFE_UPDATES=0;

LUB

Iść do Edit --> Preferences

Kliknij SQL Queries kartę i odznacz Safe Updates pole wyboru

Query --> Reconnect to Server

Teraz uruchom zapytanie SQL

Balu
źródło
26

Jeśli jesteś w trybie awaryjnym, musisz podać id w klauzuli where. Więc coś takiego powinno działać!

UPDATE tablename SET columnname=1 where id>0
Tomisław
źródło
1
Ta strona potwierdza ten fakt: bennadel.com/blog/…
DivDiff 15.01.19
20

W WorkBench rozwiązałem ten problem, dezaktywując tryb bezpiecznej aktualizacji:

-Edytuj -> Preferencje -> Edytor SQL, a następnie odznacz Bezpieczna aktualizacja.

Abdelhadi Lahlou
źródło
7
To działa, ale musiałem zrestartować MySQL Workbench.
Lanil Marasinghe
17

Znalazłem odpowiedź Problem polegał na tym, że muszę poprzedzić nazwę tabeli nazwą schematu. tzn. polecenie powinno brzmieć:

UPDATE schemaname.tablename SET columnname=1;

Dziękuje wszystkim.

Jury A.
źródło
5
Możesz uniknąć wspominania nazwy schematu, wybierając schemat na lewym panelu. Wybranie schematu w lewym panelu oznacza, że ​​używasz wybranego schematu / bazy danych
Ripon Al Wasim
10
To nie jest odpowiedź na rozwiązanie problemu opisanego w pytaniu (i tytule). Powinieneś oznaczyć inną jako zaakceptowaną.
T30
Próbowałem z nazwą schematu, ale otrzymałem ten sam błąd, zaktualizuj qms-active-db.gh_table set bookmark = '1660_207100000001000'
Code_Mode
3
To nie jest odpowiedź!
Ezechiel Wiktor
1
zła odpowiedź, na poprawną odpowiedź odpowiada Habibillah (poniżej)
hariharan s
14

W MySQL Workbech wersja 6.2 nie wychodzi z SQLQueriesopcji Preferencji .

W takim przypadku możliwe jest użycie: SET SQL_SAFE_UPDATES=0;

ferdiado
źródło
1
Istnieje, ale opcja jest teraz w „Edytorze SQL”.
Philip Olson
Nie widzę tej opcji. Możesz dostać zrzut ekranu. Dzięki
ferdiado,
Otwórz Preferencje -> karta Edytor SQL -> Na dole. Wersja 6.2-beta nie miała tej opcji, więc być może będziesz musiał zaktualizować do wersji 6.2.3+.
Philip Olson,
moja wersja to 6.3, Jest poniżej -> Edytor SQL -> Inne
ty
12

Najprostszym rozwiązaniem jest zdefiniowanie limitu wiersza i wykonanie. Odbywa się to ze względów bezpieczeństwa.

Ruwantha
źródło
2
+1 dla tego rozwiązania. Usuń z TABELI, gdzie kolumna = limit „xyz” 9999999999
FlyingZebra1
2
Ta odpowiedź powinna być odpowiedzią zaakceptowaną, ponieważ jest to najmniej niebezpieczny sposób.
Julian
7

Ponieważ na pytanie udzielono odpowiedzi i nie miało ono nic wspólnego z bezpiecznymi aktualizacjami, może to być złe miejsce; Zamierzam tylko dodać informacje.

Próbowałem być dobrym obywatelem i zmodyfikowałem zapytanie, aby użyć tabeli tymczasowej identyfikatorów, które zostaną zaktualizowane:

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

Niepowodzenie. Zmodyfikowano aktualizację do:

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

To się udało. Cóż, golly - jeśli zawsze dodaję, gdzie klucz <> 0, aby obejść kontrolę bezpiecznej aktualizacji, lub nawet ustawiłem SQL_SAFE_UPDATE = 0, to straciłem „sprawdzenie” w moim zapytaniu. Równie dobrze mogę po prostu wyłączyć tę opcję na stałe. Przypuszczam, że powoduje to usunięcie i zaktualizowanie dwuetapowego procesu zamiast jednego ... ale jeśli wpiszesz wystarczająco szybko i przestaniesz myśleć o tym, że klucz jest wyjątkowy, ale raczej po prostu uciążliwy ...

Gerard ONeill
źródło
4

To prawda, że ​​w większości przypadków nie ma to sensu. Ale w końcu doszedłem do następującego oświadczenia i działa dobrze:

update tablename  set column1 = '' where tablename .id = (select id from tablename2 where tablename2.column2 = 'xyz');
Sonic-Mayhem
źródło
3

Dotyczy to komputerów Mac, ale musi być taki sam w przypadku innych systemów operacyjnych, z wyjątkiem lokalizacji preferencji.

Błąd, który pojawia się, gdy próbujemy wykonać niebezpieczną DELETEoperację

Kliknij preferencje, gdy pojawi się ten błąd

W nowym oknie odznacz opcję Safe updates

Odznacz bezpieczne aktualizacje

Następnie zamknij i ponownie otwórz połączenie. Nie ma potrzeby ponownego uruchamiania usługi.

Teraz spróbujemy DELETEponownie z udanymi wynikami.

wprowadź opis zdjęcia tutaj

Więc o co chodzi z tymi bezpiecznymi aktualizacjami? To nie jest zła rzecz. Tak mówi o tym MySql.

Korzystanie z --safe-updatesopcji

Dla początkujących przydatna jest opcja uruchamiania --safe-updates(lub --i-am-a-dummy, która ma ten sam efekt). Jest to pomocne w przypadkach, w których mógłbyś wydać DELETE FROM tbl_nameoświadczenie, ale zapomniałeś WHEREklauzuli. Zwykle taka instrukcja usuwa wszystkie wiersze z tabeli. Za pomocą --safe-updatesmożna usunąć wiersze tylko poprzez określenie kluczowych wartości, które je identyfikują. Pomaga to zapobiegać wypadkom.

Gdy skorzystasz z tej --safe-updatesopcji, mysql wydaje następującą instrukcję, gdy łączy się z serwerem MySQL:

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

Włączenie tej opcji jest bezpieczne podczas pracy z produkcyjną bazą danych. W przeciwnym razie musisz bardzo uważać, aby przypadkowo nie usunąć ważnych danych.

Krishnadas PC
źródło