1. 程式人生 > >常見的 MySQL 錯誤(持續更新)

常見的 MySQL 錯誤(持續更新)

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  | 李四        |
+-----------+-------------+