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?


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


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!


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;

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.


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.


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


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]

41
  1. Preferencje...
  2. „Bezpieczne aktualizacje” ...
  3. Uruchom ponownie serwer

Preferencje...

Bezpieczne aktualizacje Uruchom ponownie serwer


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



20

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

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


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.


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;


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.


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 ...


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.