รหัสข้อผิดพลาดของ MySQL: 1175 ระหว่างการอัพเดทใน MySQL Workbench


816

ฉันพยายามอัปเดตคอลัมน์visitedเพื่อให้ค่า 1 ฉันใช้ MySQL workbench และฉันเขียนคำสั่งในตัวแก้ไข SQL จากภายใน workbench ฉันกำลังเขียนคำสั่งต่อไปนี้:

UPDATE tablename SET columnname=1;

มันทำให้ฉันมีข้อผิดพลาดต่อไปนี้:

คุณกำลังใช้เซฟโหมดอัปเดตและคุณพยายามอัปเดตตารางโดยไม่มีตำแหน่งที่ใช้คอลัมน์คีย์เมื่อต้องการปิดใช้งานเซฟโหมดให้สลับตัวเลือก ....

ผมทำตามคำแนะนำและผมจะไม่เลือกช่องsafe updateตัวเลือกจากEditเมนูแล้วนั้นPreferences SQL Editorข้อผิดพลาดเดียวกันยังคงปรากฏ & ฉันไม่สามารถอัปเดตค่านี้ ได้โปรดบอกฉันว่ามีอะไรผิดปกติ?


4
คุณทราบหรือไม่ว่าจะเป็นการอัปเดตแถวทั้งหมดในตารางของคุณเมื่อมีการเยี่ยมชม = 0 เพื่อเข้าชม = 1 หรือไม่ นี่คือสิ่งที่คุณต้องการ?
Mark Byers

23
หลังจากยกเลิกการเลือก "Safe Updates" ทำตามขั้นตอนด้านล่าง: Query -> เชื่อมต่อกับเซิร์ฟเวอร์อีกครั้ง ตอนนี้ดำเนินการค้นหาของคุณ
Ripon Al Wasim

5
คุณต้องเชื่อมต่อกับเซิร์ฟเวอร์ MySQL (รีสตาร์ทการเชื่อมต่อ MySQL) ก่อนที่การเปลี่ยนแปลงนี้จะมีผล
Philip Olson

คำตอบ:


1612

ดูเหมือนว่าเซสชัน MySql ของคุณจะมีชุดตัวเลือกการอัปเดตอย่างปลอดภัย ซึ่งหมายความว่าคุณไม่สามารถอัปเดตหรือลบบันทึกโดยไม่ระบุคีย์ (เช่นprimary key) ในส่วนคำสั่ง

ลอง:

SET SQL_SAFE_UPDATES = 0;

หรือคุณสามารถปรับเปลี่ยนคิวรีเพื่อทำตามกฎ (ใช้primary keyในwhere clause)


ฉันบอกว่าฉันได้ปิดการใช้งานตัวเลือกการอัพเดทอย่างปลอดภัยจาก GUI ซึ่งมีผลเช่นเดียวกับ id ที่ฉันพิมพ์คำสั่ง อย่างไรก็ตามขอบคุณสำหรับคำตอบของคุณ แต่ฉันได้ตอบคำถามของฉันไปแล้ว ตรวจสอบคำตอบของฉันเพื่อทราบว่าปัญหาคืออะไร
คณะลูกขุน

8
เมื่อคุณเปลี่ยนตัวเลือกใน GUI คุณจะต้องเชื่อมต่อกับฐานข้อมูลอีกครั้งเพื่อให้การตั้งค่าถูกต้อง
Tim Koscielski

31
อย่าลืมกลับด้วยSET SQL_SAFE_UPDATES = 1เมื่อเสร็จแล้วเพราะมันเป็นคุณสมบัติด้านความปลอดภัยที่คุ้มค่า
StockB

4
ฉันไม่เห็นด้วยกับ StockB ... คุณอาจต้องการใช้มันต่อไปในขณะที่คุณใช้ SQL ได้ดีขึ้น แต่เมื่อคุณรู้ว่าคุณกำลังทำอะไร ... สิ่งนั้นไร้ประโยชน์อย่างสมบูรณ์ คุณไม่ควรพัฒนาข้อมูลของคุณบนเซิร์ฟเวอร์ที่ใช้งานจริงอยู่แล้วดังนั้นแม้ว่าคุณจะทำไม่ดีสิ่งเดียวที่คุณควรทำคือเซิร์ฟเวอร์ dev ของคุณ .. ซึ่งไม่มีใครยอมแพ้เลย
Mathieu Turcotte

3
ฉันแค่บอกว่าฉันค้นหาโพสต์นี้ 20 ครั้งในช่วง 6 เดือนที่ผ่านมาเพราะฉันมีตัวเลือกนี้เป็นเท็จตลอด 11 ปี แต่ตอนนี้ฉันทำงานกับ บริษัท ที่มีชุดนี้เป็นจริงในการพัฒนาและการผลิต มีเหตุผลมากมายที่จะตั้งค่าเป็น 0 โดยค่าเริ่มต้นตัวอย่างเช่นเมื่อคุณพัฒนาคุณลักษณะแบบสแตนด์อโลนที่คุณอาจต้องการส่งออกไปยัง csv โดยตรงจากนั้นทำเครื่องหมายว่าเป็นสิ่งที่ส่งออกหรือสิ่งที่คล้ายกัน บางครั้งมันน่ารำคาญเนื่องจากการอัพเดททั่วโลกซึ่งเห็นได้ชัดว่าไม่มีตัวกรอง pk ใด ๆ ฉันเห็นว่ามันเป็นการป้องกันแบบ noob มากกว่าฟีเจอร์ที่มีประโยชน์จริง
JoelBonetR

454

ทำตามขั้นตอนต่อไปนี้ก่อนที่จะดำเนินการคำสั่ง UPDATE: ใน MySQL Workbench

  1. ไปที่Edit->Preferences
  2. คลิกที่"SQL Editor"แท็บและuncheck"การอัพเดทที่ปลอดภัย"check box
  3. Query-> Reconnect to Server // ออกจากระบบจากนั้นเข้าสู่ระบบ
  4. ตอนนี้ดำเนินการแบบสอบถาม SQL ของคุณ

ps, ไม่จำเป็นต้องรีสตาร์ท MySQL daemon!


20
สำหรับเวอร์ชัน 6.3 ขั้นตอนที่ 2 ควรเป็น"Sql Editor"แทน"Sql Queries"และจากนั้นจะมีช่องทำเครื่องหมายที่ด้านล่างสำหรับ"Safe Updates"
meconroy

1
ถ้ามันเป็นสิ่งที่ครั้งหนึ่งผมขอแนะนำให้คุณหันกลับไปเช่นนี้ทำให้มันง่ายมากที่จะพระราชทานโคลนข้อมูลของคุณถ้าคุณไม่ระวัง
Frankenmint

2
ขอบคุณ conroy ในขณะที่ฉันไม่เห็นกล่องนั้น ฉันแค่ต้องขยายหน้าต่าง
arn-arn

บางทีพวกเขาย้ายมัน แต่ใน MySQL Workbench 6.0 มันอยู่ภายใต้ "แบบสอบถาม SQL" ไม่ใช่ "SQL Editor"
MPelletier

1
ใช่ที่นี่ต้องเลื่อนลงเล็กน้อยเพื่อดู
Elon Zito

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 เป็นค่าเริ่มต้นสำหรับ REASON คุณสามารถขับรถยนต์โดยไม่มีเข็มขัดนิรภัยและสิ่งอื่น ๆ หากคุณรู้ว่าฉันหมายถึงอะไร) เพียงเพิ่ม WHERE ในส่วนคำสั่ง KEY-value ที่ตรงกับทุกอย่างเช่นคีย์หลักเปรียบเทียบกับ 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
นี่คืออัจฉริยะ!
Amos Long

คำตอบนิยม: +1
Asif Raza

2
ฮ่าฮ่านั่นเป็นเคล็ดลับที่ดี ฉันใช้WHERE id > 0เป็นเล่ห์เหลี่ยมตามบรรทัดนี้
Csaba Toth

มันใช้งานไม่ได้สำหรับฉันมันแสดงข้อความเดิมต่อไป ฉันแก้ไขมันโดยปิดการใช้งานโหมดอัปเดตอย่างปลอดภัยโดย: -Edit -> การตั้งค่า -> ตัวแก้ไข Sql จากนั้นยกเลิกการเลือก Safe update
Abdelhadi Lahlou

2
สิ่งนี้ทำให้ปลอดภัยได้อย่างไร
Matt Messersmith

107

สิ่งที่จำเป็นคือเริ่มแบบสอบถามใหม่และเรียกใช้:

SET SQL_SAFE_UPDATES = 0;

จากนั้น: เรียกใช้แบบสอบถามที่คุณพยายามเรียกใช้ที่ไม่ได้ทำงานก่อนหน้านี้


7
ยินดีต้อนรับสู่ SO อย่าลืมอ่านหน้าทัวร์และหน้าช่วยเหลือและหลีกเลี่ยงการโพสต์คำตอบเช่นนี้เพราะคำตอบมากมายด้านล่างนี้ตอบสิ่งเดียวกันและได้โพสต์เมื่อเดือนที่แล้ว
WOUNDEDStevenJones

1
คุณอาจเปิดใช้งานตัวเลือกนี้อีกครั้งหลังจากเรียกใช้แบบสอบถาม
kta

คำตอบนี้เพิ่มอะไร? คุณเพิ่งโพสต์สิ่งเดียวกันกับ Habibillah มากกว่าสองปีต่อมา พยายามเก็บเกี่ยวกรรมไหม?
Luc


66

รหัสข้อผิดพลาด: 1175 คุณกำลังใช้โหมดการอัพเดทอย่างปลอดภัยและคุณพยายามอัปเดตตารางโดยไม่มี WHERE ที่ใช้คอลัมน์ KEY ในการปิดการใช้งานเซฟโหมดให้สลับตัวเลือกในการตั้งค่า -> ตัวแก้ไข SQL และเชื่อมต่อใหม่

ปิด "โหมดการอัปเดตอย่างปลอดภัย" ชั่วคราว

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

ปิด "Safe Update Mode" ตลอดไป

ปรับแต่ง Mysql 8.0:

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

ป้อนคำอธิบายรูปภาพที่นี่ เวอร์ชันเก่าสามารถ:

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

41
  1. การตั้งค่า ...
  2. "การอัปเดตอย่างปลอดภัย" ...
  3. รีสตาร์ทเซิร์ฟเวอร์

การตั้งค่า ...

อัปเดตอย่างปลอดภัย รีสตาร์ทเซิร์ฟเวอร์


นี่ควรเป็นคำตอบที่ได้รับการยอมรับมันน่าเสียดายที่มันไม่ได้เป็น
ErrorrrDetector

1
คุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ ควรเพียงพอที่จะปิดและเปิดการเชื่อมต่ออีกครั้ง
Marc L.

1
ใน MAC ค่ากำหนดจะอยู่ในเมนูด้านบนของ MySQLWorkbench
zwitterion

36
SET SQL_SAFE_UPDATES=0;

หรือ

ไปที่ Edit --> Preferences

คลิก SQL Queriesแท็บและยกเลิกการทำเครื่องหมายที่ Safe Updatesช่องทำเครื่องหมาย

Query --> Reconnect to Server

ตอนนี้รันการสืบค้น sql ของคุณ


26

หากคุณอยู่ในเซฟโหมดคุณต้องระบุรหัสในส่วนคำสั่ง ดังนั้นสิ่งนี้ควรใช้งานได้!

UPDATE tablename SET columnname=1 where id>0

1
หน้านี้ยืนยันข้อเท็จจริงนี้: bennadel.com/blog/…
DivDiff

20

ใน WorkBench ฉันแก้ไขได้โดยการปิดใช้งานโหมดการอัพเดทอย่างปลอดภัย:

-Edit -> การตั้งค่า -> ตัวแก้ไข Sql จากนั้นยกเลิกการเลือก Safe update


7
ใช้งานได้ แต่ฉันต้องเริ่ม MySQL Workbench ใหม่
Lanil Marasinghe

17

ฉันพบคำตอบ ปัญหาคือฉันต้องนำหน้าชื่อตารางด้วยชื่อสคีมา เช่นคำสั่งควรเป็น:

UPDATE schemaname.tablename SET columnname=1;

ขอบคุณทุกคน


5
คุณสามารถหลีกเลี่ยงการพูดถึงชื่อสคีมาได้โดยเลือกสคีมาที่แผงด้านซ้าย การเลือกสคีมาที่แผงด้านซ้ายหมายความว่าคุณกำลังใช้สคีมา / ฐานข้อมูลที่เลือกไว้
Ripon Al Wasim

10
นี่ไม่ใช่คำตอบสำหรับการแก้ปัญหาที่อธิบายไว้ในคำถาม (และชื่อเรื่อง) คุณควรทำเครื่องหมายว่าอื่นยอมรับ
T30

ฉันพยายามด้วย schemaname แต่ได้รับข้อผิดพลาดเดียวกันอัปเดต. qms-active-dbggh table ตั้งค่า bookmark = '1660_207100000001000'
Code_Mode

3
นี่ไม่ใช่คำตอบ!
เอเสเคียลวิคเตอร์

1
คำตอบที่ไม่ถูกต้องคำตอบที่ถูกต้องจะตอบโดย Habibillah (ด้านล่าง)
hariharan s

14

ใน MySQL Workbech เวอร์ชั่น 6.2 ไม่ออกจากSQLQueriesตัวเลือกการตั้งค่า

ในกรณีนี้มันเป็นไปได้ใช้: SET SQL_SAFE_UPDATES=0;


1
มีอยู่ แต่ตัวเลือกอยู่ภายใต้ "ตัวแก้ไข SQL" ในขณะนี้
Philip Olson

ฉันไม่เห็นตัวเลือกนี้ กรุณาคุณจะได้รับภาพหน้าจอ ขอบคุณ
ferdiado

เปิดการตั้งค่า -> แท็บตัวแก้ไข SQL -> ที่ด้านล่าง รุ่น 6.2 เบต้าไม่มีตัวเลือกนี้ดังนั้นบางทีคุณอาจต้องอัปเกรดเป็น 6.2.3+
Philip Olson

รุ่นของฉันคือ 6.3, อยู่ภายใต้ -> ตัวแก้ไข SQL -> อื่น ๆ
tyan

12

ทางออกที่ง่ายที่สุดคือการกำหนดขีด จำกัด แถวและดำเนินการ สิ่งนี้ทำเพื่อความปลอดภัย


2
+1 ในโซลูชันนี้ ลบออกจาก
Table

2
คำตอบนี้ควรเป็นคำตอบที่ยอมรับได้เพราะเป็นวิธีที่ไม่ปลอดภัยน้อยที่สุด
Julian

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 แต่จะต้องเหมือนกันสำหรับ OS อื่นยกเว้นตำแหน่งของการตั้งค่า

ข้อผิดพลาดที่เราได้รับเมื่อเราพยายาม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;

การเปิดตัวเลือกนี้ปลอดภัยในขณะที่คุณจัดการกับฐานข้อมูลการผลิต มิฉะนั้นคุณจะต้องระมัดระวังไม่ให้ลบข้อมูลสำคัญโดยไม่ได้ตั้งใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.