mysql 資料庫問題整理
1. 資料庫中出現亂碼
問題描述: 在html 頁面中設定了頁面的編碼,設定了後臺req.setCharacterEncoding("UTF-8"); 但是資料庫中還是有亂碼,檢視資料庫編碼和表編碼均設為UTF-8,
解決: 發現配置的 mysql url 中沒有帶編碼為UTF-8; 例如: jdbc:mysql://localhost:3306/httpclientcrawler?useUnicode=true&characterEncoding=UTF-8
參考: https://www.cnblogs.com/tom-plus/p/5701741.html
2. mysql Lock wait timeout exceeded; try restarting transaction (資料庫鎖超時等待)
問題描述: 後臺經常報鎖超時等待,是因為有執行緒拿住了鎖,其他執行緒拿不到鎖,超時等待的原因造成的,是當前事務在等待其它事務釋放鎖資源造成的。
解決: 在mysql查詢中執行以下指令
SELECT * FROM information_schema.innodb_trx
檢視沒有引數的執行緒,並殺死,
kill + mysql_thread_id 殺死多餘的執行緒
參考: https://blog.csdn.net/wanderlustLee/article/details/79235005
3.Could not retrieve transaction read-only status from server
Caused by: java.sql.SQLException: ResultSet is from UPDATE. No Data.
mysql 資料庫報只讀事務
問題描述:在select 操作時,事務時只讀事務,如果後面接著操作 delete 等事務,就會報這個問題,下面一行 No Data 可能是另外的錯
解決:
查詢資料隔離級別:SHOW VARIABLES LIKE '%iso%';
如果隔離級別: REPEATABLE-READ 則改成 READ-COMMITTED
sql :SET GLOBAL tx_isolation='READ-COMMITTED'; (記得java重啟應用)
要永久生效的就改my.cnf。
分析:當資料庫隔離級別為REPEATABLE-READ時,釋出一個select語句也算是事物的開始,而且在hibernate裡會把以select語句開頭的事務標記為只讀事務,此時在這個事務裡再執行insert、update、delete等
參考: https://blog.csdn.net/zero_plus/article/details/47295507
4 1093 錯誤,你不能先根據某個表查詢,在刪除或更新某個表
1093
You can't specify target table 'user_friend' for update in FROM clause
例如: DELETE FROM user_friend WHERE account IN (SELECT friend_account FROM user_friend WHERE account = 'xxx' AND friend_group_id='2') AND friend_account = 'xxx'
如果in 後面跟的是正常的 id 或者是用其他表查出的則不會報錯,只限於mysql資料庫
參考: https://www.jb51.net/article/60926.htm
5 mybaties 一個delete 同時寫刪除多個表的多條sql 語句
要在jdbc.url 的後面加上 批量更新的語句 allowMultiQueries=true
可以同時update/delete 多條語句
6. mysql : ERROR 1813 (HY000): Tablespace '`db1`.`table1`' exists.
參考:https://blog.csdn.net/hero_hope/article/details/82256458?utm_source=blogxgwz0
mysql 某個表突然資料丟失,將表刪除後,無法繼續新建同名表,提示表不存在
- 表現:table1表被刪以後,想要重新建,結果新建不了
- 原因:table1表在對應的表空間依然存在
- 解決辦法:刪除對應的.ibd檔案即可,比如上面這個,找到mysql下,db1資料夾下的table1.ibd檔案,幹掉即可
7. MySQL資料庫表中有自增主鍵ID,當用SQL插入語句中插入語句帶有ID列值記錄的時候;如何表示該id列
1. 將該列表示為 0 或 null,mysql 會自動處理該AUTO_INCREMENT自增欄位
2. 手動指定需要插入的列,不插入這一個欄位的資料!
參考 : https://blog.csdn.net/qq_16143757/article/details/75303442
8. mysql 避免重複插入
參考: https://www.cnblogs.com/duanxiaojun/p/6855680.html?utm_source=itdadao&utm_medium=referral
1.insert ignore into
出現相同列時,自動忽略新的列,但是有錯誤,也會自動忽略
2.on duplicate key update
前提: 是需要將將主鍵列寫入insert 語句中,有錯誤不會忽略
3.insert … select … where not exist
根據select的條件判斷是否插入,可以不光通過primary 和unique來判斷,也可通過其它條件
例如:
INSERT INTO public_message_status(列一,列二)
SELECT 值一,值二 FROM DUAL WHERE NOT EXISTS(SELECT public_message_status_id FROM public_message_status WHERE ...)
4.replace into
如果存在相同紀錄,先刪除舊資料,在插入新資料