一.背景介紹
這是我的表:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| na | text | YES | | NULL | |
| birthDate | datetime | YES | | NULL | |
| class | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
這是我想完成的任務代碼(目的:將張三的班級更新爲李四的):
UPDATE test.student class
SET class = ( SELECT class FROM student WHERE student.na = '李四')
WHERE
student.na = '張三'
二.遇到問題,搜索,解決問題……
1.遇到的第一個問題-1054:
1054 - Unknown column ‘student.na’ in 'where clause’
於是我將代碼刪減,排查可能的錯誤
UPDATE test.student class
SET class = 1
WHERE
student.na = '張三'
發現上述錯誤仍然存在,把where子句刪掉就可以執行了,報錯說【'student.na’行,未識別】,我十分不解,但當我刪去前面的表名”student“後執行成功!
UPDATE test.student class
SET class = 1
WHERE
na = '張三'
於是我猜想,update命令限定了某張表,列名前就不可以畫蛇添足地加表名了。
然後我將完整代碼改成了:
UPDATE test.student class
SET class = ( SELECT class FROM student WHERE na = '李四')
WHERE
na = '張三'
2.又見錯誤-1093:
1093 - You can’t specify target table ‘class’ for update in FROM clause
它的意思是說,不能先select出同一表中的某些值,再update這個表(在同一語句中),
即不能依據某字段值做判斷再來更新某字段的值。
網上查了一下,是MySQL不支持這種操作的錯誤,都是通過”繞“來解決
(來自:https://zhidao.baidu.com/question/68619324.html)
方案一:
多嵌套一層子查詢,再進行刪除,
方案二:
1.創建一張臨時回表,將答要刪除的條件自動存入臨時表中:
2.再根據臨時表,刪除主表數據:
3.最後刪除掉臨時表:
我不想再建個表,所以用了方案一:
UPDATE test.student class
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') )
WHERE
na = '張三'
我在外面嵌套了一層【(SELECT class from(____))】
3.但是又出現了問題-1248:
(我說,這挫敗感來的也太頻繁了,設計得這麼不直觀又易出錯,怪不得程序員掉頭髮)
1248 - Every derived table must have its own alias
繼續搜索……找到答案:https://blog.csdn.net/cao478208248/article/details/28122113
“這句話的意思是說每個派生出來的表都必須有一個自己的別名……進行嵌套查詢的時候子查詢出來的的結果是作爲一個派生表來進行上一級的查詢的,所以子查詢的結果必須要有一個別名“
於是我模仿着加了個【as t】
UPDATE test.student class
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') as t )
WHERE
na = '張三'
終於成功執行!