Mã lỗi MySQL: 1175 trong khi CẬP NHẬT trong MySQL Workbench


817

Tôi đang cố cập nhật cột visitedđể cung cấp cho nó giá trị 1. Tôi sử dụng bàn làm việc của MySQL và tôi đang viết câu lệnh trong trình soạn thảo SQL từ bên trong bàn làm việc. Tôi đang viết lệnh sau:

UPDATE tablename SET columnname=1;

Nó cho tôi lỗi sau:

Bạn đang sử dụng chế độ cập nhật an toàn và bạn đã cố cập nhật bảng mà không có WHERE sử dụng cột KEY Để tắt chế độ an toàn, hãy bật tùy chọn ....

Tôi làm theo các hướng dẫn, và tôi bỏ chọn các safe updatetùy chọn từ Editmenu sau đó Preferencessau đó SQL Editor. Lỗi tương tự vẫn xuất hiện và tôi không thể cập nhật giá trị này. Xin vui lòng, cho tôi biết những gì là sai?


4
Bạn có biết rằng điều này sẽ cập nhật tất cả các hàng trong bảng của bạn nơi đã truy cập = 0 để được truy cập = 1 không? Đây có phải là những gì bạn muốn?
Mark Byers

23
Sau khi bỏ chọn "Cập nhật an toàn", hãy làm theo bước bên dưới: Truy vấn -> Kết nối lại với máy chủ. Bây giờ hãy thực hiện truy vấn của bạn
Ripon Al Wasim

5
Bạn phải kết nối lại với Máy chủ MySQL (khởi động lại kết nối MySQL) trước khi thay đổi này có hiệu lực.
Philip Olson

Câu trả lời:


1613

Có vẻ như phiên MySql của bạn có tùy chọn cập nhật an toàn được đặt. Điều này có nghĩa là bạn không thể cập nhật hoặc xóa các bản ghi mà không chỉ định khóa (ví dụ primary key) trong mệnh đề where.

Thử:

SET SQL_SAFE_UPDATES = 0;

Hoặc bạn có thể sửa đổi truy vấn của mình để tuân theo quy tắc (sử dụng primary keytrong where clause).


Tôi đã đề cập rằng tôi đã vô hiệu hóa tùy chọn cập nhật an toàn từ GUI có tác dụng tương tự như id tôi đã gõ lệnh. Tuy nhiên, cảm ơn câu trả lời của bạn, nhưng tôi đã trả lời câu hỏi của tôi. Kiểm tra câu trả lời của tôi để biết vấn đề là gì.
Ban giám khảo A

8
Khi bạn thay đổi tùy chọn trong GUI, bạn cần kết nối lại với cơ sở dữ liệu để cài đặt được đặt đúng.
Tim Koscielski

31
Hãy chắc chắn đặt lại điều này SET SQL_SAFE_UPDATES = 1khi bạn hoàn thành, vì đây là một tính năng an toàn đáng giá.
StockB

4
Tôi không đồng ý với StockB ... Bạn có thể muốn tiếp tục sử dụng SQL trong khi bạn sử dụng SQL tốt hơn ... nhưng một khi bạn biết những gì bạn đang làm ... điều đó hoàn toàn vô dụng. Dù sao thì bạn cũng không nên phát triển công cụ của mình trên một máy chủ sản xuất, vì vậy ngay cả khi bạn gây rối, điều duy nhất bạn nên phá vỡ là máy chủ dev của bạn .. dù sao thì không ai có thể hiểu được.
Mathieu Turcotte

3
Tôi chỉ đến để nói rằng tôi đã tìm kiếm bài đăng này như 20 lần trong 6 tháng qua vì tôi luôn luôn lựa chọn này thành sai trong 11 năm, nhưng bây giờ tôi đang làm việc cho một công ty với sự phát triển và sản xuất này. Có nhiều lý do để đặt nó thành 0 theo mặc định, ví dụ: khi bạn phát triển các tính năng độc lập mà bạn có thể muốn xuất trực tiếp sang csv và sau đó đánh dấu nó là xuất hoặc một cái gì đó tương tự. Những lần khác, nó gây phiền nhiễu do các bản cập nhật toàn cầu rõ ràng không có bộ lọc pk. Tôi thấy nó giống như một sự bảo vệ không phải là một tính năng hữu ích thực sự.
JoelBonetR

454

Thực hiện theo các bước sau trước khi thực hiện lệnh UPDATE: Trong MySQL Workbench

  1. Chuyển đến Edit->Preferences
  2. Nhấp vào "SQL Editor"tab và uncheck"Cập nhật an toàn"check box
  3. Query-> Reconnect to Server // đăng xuất rồi đăng nhập
  4. Bây giờ thực hiện truy vấn SQL của bạn

ps, Không cần phải khởi động lại daemon MySQL!


20
Đối với phiên bản 6.3, bước 2 nên được "Sql Editor"thay thế "Sql Queries"và sau đó có một hộp kiểm ở phía dưới cho"Safe Updates"
meconroy

1
nếu đó là một lần duy nhất tôi khuyên bạn nên bật lại vì điều này giúp bạn dễ dàng lấy dữ liệu của mình nếu bạn không cẩn thận
Frankenmint

2
cảm ơn conroy. Trong một thời gian tôi không thể nhìn thấy cái hộp đó. Tôi chỉ phải phóng to cửa sổ.
arn-arn

Có thể họ đã di chuyển nó, nhưng trong MySQL Workbench 6.0, nó nằm trong "Truy vấn SQL", không phải là "Trình soạn thảo SQL"
MPelletier

1
vâng tương tự ở đây, đã phải cuộn xuống một chút để xem nó.
Elon Zito

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

4
Thật không may, các giải pháp dựa trên truy vấn khác không làm việc cho tôi. Nhưng cái này đã làm! Tôi đánh giá cao việc bạn đã thêm một dòng để bật lại các cập nhật an toàn.
SherylHohman

1
Tôi thực sự thích cái này vì nó có lẽ là chung nhất trong khi vẫn giữ an toàn.
Nae

117

Không cần đặt SQL_SAFE_UPDATE thành 0 , tôi thực sự sẽ không khuyến khích nó làm theo cách đó. SAFE_UPDATE theo mặc định được bật cho LÝ DO. Bạn có thể lái xe không có dây an toàn và những thứ khác nếu bạn hiểu ý tôi;) Chỉ cần thêm vào mệnh đề WHERE một giá trị KEY khớp với mọi thứ như khóa chính so với 0, vì vậy thay vì viết:

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.

Bây giờ bạn có thể yên tâm mọi bản ghi được (LUÔN) cập nhật như bạn mong đợi.


3
Đây là thiên tài!
Amos Long

câu trả lời được đánh giá cao: +1
Asif Raza

2
Haha, đó là một mẹo hay. Tôi đã sử dụng WHERE id > 0như một mẹo dọc theo dòng này.
Csaba Toth

Nó không hoạt động với tôi, nó tiếp tục hiển thị cho tôi cùng một Thông điệp. Tôi đã giải quyết nó bằng cách hủy kích hoạt chế độ cập nhật an toàn bằng cách: -Edit -> Preferences -> Sql Editor sau đó bỏ chọn Cập nhật an toàn.
Abdelhadi Lahlou

2
Làm thế nào điều này thực sự làm cho nó an toàn hơn, mặc dù?
Matt Messersmith

107

Tất cả những gì cần thiết là: Bắt đầu một truy vấn mới và chạy:

SET SQL_SAFE_UPDATES = 0;

Sau đó: Chạy truy vấn mà bạn đang cố chạy mà trước đây không hoạt động.


7
Chào mừng bạn đến với SO, hãy chắc chắn đọc trang tham quantrang trợ giúp và tránh đăng câu trả lời như thế này vì nhiều câu trả lời dưới đây nói điều tương tự và đã được đăng cách đây vài tháng
WOUNDEDStevenJones

1
Bạn cũng có thể bật lại tùy chọn này sau khi chạy truy vấn.
kta

Câu trả lời này thêm gì? Bạn vừa đăng bài tương tự như Habibillah, hơn hai năm sau. Đang cố gặt nghiệp chướng?
Luc


66

Mã lỗi: 1175. Bạn đang sử dụng chế độ cập nhật an toàn và bạn đã cố cập nhật bảng mà không có WHERE sử dụng cột KEY Để tắt chế độ an toàn, hãy chuyển tùy chọn trong Tùy chọn -> SQL Editor và kết nối lại.

TẮT tạm thời "Chế độ cập nhật an toàn"

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

TẮT "Chế độ cập nhật an toàn" mãi mãi

Bàn làm việc Mysql 8.0:

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

nhập mô tả hình ảnh ở đây Phiên bản cũ có thể:

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

41
  1. Sở thích...
  2. "Cập nhật an toàn" ...
  3. Khởi động lại máy chủ

Sở thích...

Cập nhật an toàn Khởi động lại máy chủ


Đây đáng lẽ phải là câu trả lời được chấp nhận. Thật đáng tiếc vì nó đã không xảy ra
ErrorrrDetector

1
Bạn không cần phải khởi động lại máy chủ. Nó chỉ đủ để đóng và mở lại kết nối.
Marc L.

1
Trong MAC, các tùy chọn nằm trong menu trên cùng của MySQLWorkbench.
zwitterion

36
SET SQL_SAFE_UPDATES=0;

HOẶC LÀ

Đi đến Edit --> Preferences

Bấm vào SQL Queries tab và bỏ chọn Safe Updates hộp kiểm

Query --> Reconnect to Server

Bây giờ thực hiện truy vấn sql của bạn


26

Nếu bạn đang ở chế độ an toàn, bạn cần cung cấp id trong mệnh đề where. Vì vậy, một cái gì đó như thế này nên làm việc!

UPDATE tablename SET columnname=1 where id>0

1
Trang này xác nhận sự thật này: bennadel.com/blog/ Mạnh
DivDiff

20

Trên WorkBench tôi đã giải quyết nó bằng cách tắt chế độ cập nhật an toàn:

-Edit -> Preferences -> Sql Editor sau đó bỏ chọn Cập nhật an toàn.


7
Điều này hoạt động nhưng, tôi đã phải khởi động lại MySQL Workbench.
Lanil Marasinghe

17

Tôi tìm thấy câu trả lời. Vấn đề là tôi phải đặt trước tên bảng với tên lược đồ. tức là, lệnh nên là:

UPDATE schemaname.tablename SET columnname=1;

Cảm ơn tất cả.


5
Bạn có thể tránh đề cập đến tên lược đồ bằng cách chọn lược đồ ở bảng bên trái. Chọn lược đồ ở bảng điều khiển bên trái có nghĩa là bạn đang sử dụng lược đồ / cơ sở dữ liệu đã chọn
Ripon Al Wasim

10
Đây không phải là câu trả lời để giải quyết vấn đề được mô tả trong câu hỏi (và tiêu đề). Bạn nên đánh dấu khác là chấp nhận.
T30

Tôi đã thử với schemaname nhưng gặp lỗi tương tự, cập nhật qms-active-db.gh_table set bookmark = '1660_207100000001000'
Code_Mode

3
Đây không phải là câu trả lời!
Ezekiel Victor

1
câu trả lời sai, câu trả lời đúng được trả lời bởi Habibillah (bên dưới)
hariharan s

14

Trong phiên bản MySQL Workbech 6.2 không thoát các SQLQueriestùy chọn Tùy chọn.

Trong trường hợp này, nó có thể sử dụng: SET SQL_SAFE_UPDATES=0;


1
Nó tồn tại, nhưng tùy chọn nằm dưới "SQL Editor".
Philip Olson

Tôi không thấy tùy chọn này. Xin vui lòng bạn có thể có được một ảnh chụp màn hình. Cảm ơn
ferdiado

Mở Tùy chọn -> tab Trình soạn thảo SQL -> Ở dưới cùng. Bản phát hành 6.2-beta thiếu tùy chọn này, vì vậy có lẽ bạn sẽ cần nâng cấp lên 6.2.3+.
Philip Olson

phiên bản của tôi là 6.3, dưới -> Trình soạn thảo SQL -> Khác
tyan

12

Giải pháp đơn giản nhất là xác định giới hạn hàng và thực thi. Điều này được thực hiện cho mục đích an toàn.


2
+1 về giải pháp này. Xóa khỏi BẢNG nơi cột = 'xyz' giới hạn 9999999999
FlyingZebra1

2
Câu trả lời này phải là câu trả lời được chấp nhận vì đó là cách ít an toàn nhất.
Julian

7

Vì câu hỏi đã được trả lời và không liên quan gì đến các cập nhật an toàn, đây có thể là địa điểm sai; Tôi sẽ đăng chỉ để thêm thông tin.

Tôi đã cố gắng trở thành một công dân tốt và sửa đổi truy vấn để sử dụng bảng tạm thời của id sẽ được cập nhật:

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

Sự thất bại. Sửa đổi bản cập nhật thành:

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

Điều đó đã làm việc. Golly - nếu tôi luôn thêm khóa nơi <> 0 để kiểm tra cập nhật an toàn hoặc thậm chí đặt SQL_SAFE_UPDATE = 0, thì tôi đã mất 'kiểm tra' trên truy vấn của mình. Tôi cũng có thể tắt tùy chọn vĩnh viễn. Tôi cho rằng nó làm cho việc xóa và cập nhật quy trình hai bước thay vì một .. nhưng nếu bạn gõ đủ nhanh và ngừng suy nghĩ về khóa là đặc biệt mà chỉ là một sự phiền toái ..


4

Đúng, điều này là vô nghĩa đối với hầu hết các ví dụ. Nhưng cuối cùng, tôi đã đi đến tuyên bố sau và nó hoạt động tốt:

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

3

Cái này dành cho Mac, nhưng phải giống với các HĐH khác ngoại trừ vị trí của các tùy chọn.

Lỗi chúng tôi nhận được khi chúng tôi thử một DELETEhoạt động không an toàn

Nhấp vào tùy chọn khi bạn gặp lỗi này

Trên cửa sổ mới, bỏ chọn tùy chọn Safe updates

Bỏ chọn các bản cập nhật an toàn

Sau đó đóng và mở lại kết nối. Không cần phải khởi động lại dịch vụ.

Bây giờ chúng tôi sẽ thử DELETElại với kết quả thành công.

nhập mô tả hình ảnh ở đây

Vì vậy, tất cả về bản cập nhật an toàn này là gì? Nó không phải là một điều xấu xa. Đây là những gì MySql nói về nó.

Sử dụng --safe-updatestùy chọn

Đối với người mới bắt đầu, một tùy chọn khởi động hữu ích là --safe-updates(hoặc --i-am-a-dummy , có tác dụng tương tự). Nó rất hữu ích cho các trường hợp khi bạn có thể đã đưa ra một DELETE FROM tbl_nametuyên bố nhưng quên WHEREđiều khoản. Thông thường, một tuyên bố như vậy sẽ xóa tất cả các hàng khỏi bảng. Với --safe-updates, bạn chỉ có thể xóa các hàng bằng cách chỉ định các giá trị chính xác định chúng. Điều này giúp ngăn ngừa tai nạn.

Khi bạn sử dụng --safe-updatestùy chọn, mysql đưa ra câu lệnh sau khi kết nối với máy chủ MySQL:

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

Sẽ an toàn khi bật tùy chọn này trong khi bạn xử lý cơ sở dữ liệu sản xuất. Nếu không, bạn phải rất cẩn thận không vô tình xóa dữ liệu quan trọng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.