常見的 MySQL 錯誤(持續更新)
阿新 • • 發佈:2018-11-02
ERROR 1060
1. 錯誤描述:
Duplicate column name ‘xxx’;
重複的欄位 xxx,當新增資料庫欄位時,添加了資料庫中已存在的欄位會報此錯誤
2. 例項演示:
# 表結構如下所示
select * from dept;
+--------+----------+
| deptId | deptName |
+--------+----------+
| 1 | 開發部 |
| 2 | 測試部 |
| 3 | UI部 |
| 4 | 遊戲部 |
+--------+----------+
#在原來表結構上新增名為 deptId 的欄位
alter table dept add deptId bigint(20);
#報錯,提示deptId欄位重複
ERROR 1060 (42S21): Duplicate column name 'deptId'
dos客戶端亂碼問題
1. 問題描述:
在 Windows上使用 cmd 開啟 MySQL 出現亂碼,檢視資料庫編碼後發現編碼都是 utf8;出現這種錯誤的原因是因為作業系統為中文作業系統,預設字符集是 GB2312,但是MySQL客戶端輸出視窗顯示中文時使用的字元編碼為utf8
檢視輸出視窗使用的字元編碼
show variables like 'char%';
2.解決方法
將輸出控制檯的編碼改成 gb2312
set character_set_results=gb2312;
改變編碼後顯示
注意:如果使用 mysql 客戶端工具,不會出現這種錯誤
ERROR 1395 :Can not delete from join view
1. 錯誤描述
多表使用內連線生成檢視,嘗試從此檢視中刪除某一條記錄,出現此錯誤
#建立檢視
create view view_emp_all
as
select d.deptId,d.deptName,e.empName,e.salary,e.phone
from
dept d inner join emp e on d.deptId=e.deptId;
#檢視檢視
select * from view_emp_all;
+--------+----------+---------+--------+-------+
| deptId | deptName | empName | salary | phone |
+--------+----------+---------+--------+-------+
| 1 | 開發部 | 張三 | 10000 | 111 |
| 1 | 開發部 | 李四 | 9999 | 112 |
| 2 | 測試部 | 王五 | 8888 | 113 |
| 3 | UI部 | 趙六 | 7777 | 114 |
+--------+----------+---------+--------+-------+
刪除檢視 view_emp_all 中 deptId=1 的記錄
delete from view_emp_all where deptId=1;
ERROR 1395 (HY000): Can not delete from join view 'test55.view_emp_all'
2. 解決方法
第一種情況:檢視檢視是否可修改,只有檢視可修改才能進行刪除操作
#檢視檢視是否可更新
SELECT IS_UPDATABLE FROM information_schema.views WHERE TABLE_NAME = 'view_emp_all';
#檢視 test55 資料庫中所有檢視是否可更新
SELECT table_name,is_updatable FROM information_schema.views WHERE table_schema = 'test55';
+--------------+
| IS_UPDATABLE |
+--------------+
| YES |
+--------------+
第二種情況:通過連線查詢建立的檢視,刪除的操作可能不止改變一個表裡的記錄,資料庫為了保證資料的完整性,不會允許這麼做,所以只能從這個構建這個檢視的表裡逐步刪除記錄,才能把要刪除的檢視記錄刪除
column ‘**’ in field list is ambiguous
1、說明:
當聯表查詢時未指定欄位屬於哪一個表,產生歧義
2、例項
第一張表含有studentId欄位
select studentId,studentName from student;
+-----------+-------------+
| studentId | studentName |
+-----------+-------------+
| 16046122 | 張三 |
| 16046124 | 李四 |
| 16045122 | 王五 |
| 16045123 | 趙六 |
+-----------+-------------+
第二張表也含有studentId欄位
select studentId from truant;
+-----------+
| studentId |
+-----------+
| 16046122 |
| 16046124 |
+-----------+
可以看到當查詢時未指定student屬於哪一張表,這時發生歧義
解決方法,宣告欄位屬於哪一張表
select student.studentId,studentName from student inner join truant where student.studentId=truant.studentId;
+-----------+-------------+
| studentId | studentName |
+-----------+-------------+
| 16046122 | 張三 |
| 16046124 | 李四 |
+-----------+-------------+