你寫了一條正常的update 或者 delete 語句時(shí),語句本身是沒問題的,但是卻執(zhí)行不了。原因是是MySQL Workbench的安全設(shè)置。當(dāng)要執(zhí)行的SQL語句是進(jìn)行批量更新或者刪除的時(shí)候就會(huì)提示這個(gè)錯(cuò)誤。
在涪城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站建設(shè),涪城網(wǎng)站建設(shè)費(fèi)用合理。
打開Workbench的菜單Edit-Preferences xxx-切換到SQL Editor
把Forbid UPDATE and DELETE statements without a WHERE clause (safe updates)的勾去掉擊[OK]按鈕重新啟動(dòng)就OK了。
或者在每句語句前,加上‘SET SQL_SAFE_UPDATES=0;’
問題就解決了。
(ps:以后我會(huì)分享我所遇到的問題,這里持續(xù)更新?。?/p>
這個(gè)錯(cuò)誤是由于你用了事物,導(dǎo)致表的死鎖。 死鎖的原因很多,如果你的批量插入有依賴性的話,可能在Mysql里面形成了臟讀。
第一步先解決你的死鎖問題,用指令show engine innodb status \G 查看是那一個(gè)查詢進(jìn)程鎖表, 找出來ID,殺掉它。
第二步檢查自己的程序的SQL語言,一般批量插入的話盡量用insert into (),(),().... 一個(gè)SQL來執(zhí)行,如果需要檢查是否存在然后插入或替換,如果表有唯一索引或主鍵,用replace, 其他格式一樣。
第三步檢查你的訪問數(shù)據(jù)庫的邏輯,在什么時(shí)候進(jìn)行的commit,你在讀寫的時(shí)候是否設(shè)定了獨(dú)占式訪問方法, 或數(shù)據(jù)庫中已經(jīng)其他的存儲(chǔ)過程或觸發(fā)器同時(shí)在操作這個(gè)表。
如果以上都無效,你最好是通過上述指令同時(shí)監(jiān)控你的程序并在mysql里面用show process list查看是哪一個(gè)ID出了問題。
對(duì)table某行數(shù)據(jù)進(jìn)行更新,發(fā)現(xiàn)修改不了數(shù)據(jù),報(bào)錯(cuò)如下:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences - SQL Editor and reconnect.
原因是MySQL安全等級(jí)高,更新時(shí)不用主鍵當(dāng)where語句,就會(huì)拒絕update。
寫入Mysql語句:set sql_safe_updates =0;
之后再進(jìn)行操作即可。
MYSQL的UPDATE關(guān)于檢查更新前后數(shù)據(jù)是否變化,只有數(shù)據(jù)變化的時(shí)候才真正進(jìn)行更新操作,例如你的語句:
update user set name='xiaoy' where id=1
如果id唯一、并且存在有1的記錄,而且name上沒有限制,那么執(zhí)行結(jié)果有兩種可能:
Rows matched: 1 Changed: 1 Warnings: 0
Rows matched: 1 Changed: 0 Warnings: 0
如果該記錄以前的值就不是xiaoy,那么結(jié)果就是第一種,否則是第二種。MYSQL的這個(gè)設(shè)計(jì),減少無畏了修改操作,提高性能。
如果是name字段有約束導(dǎo)致更新失敗,語句是會(huì)報(bào)錯(cuò)的;警告是字段類型或者長(zhǎng)度等超限,導(dǎo)致更新時(shí)候進(jìn)行了處置的情況;changed=0只是信息,連警告都不算。