1.背景紹介
これは私のテーブルです:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| na | text | YES | | NULL | |
| birthDate | datetime | YES | | NULL | |
| class | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
これは私が完了したいタスクのコードです(目的:ZhangSanのクラスをLiSiのクラスに更新します):
UPDATE test.student class
SET class = ( SELECT class FROM student WHERE student.na = '李四')
WHERE
student.na = '张三'
2.問題に遭遇し、検索し、問題を解決します。
1.最初に発生した問題-1054:
1054-「where句」の不明な列「student.na」
なので、考えられるエラーのトラブルシューティングのためにコードを削除しました
UPDATE test.student class
SET class = 1
WHERE
student.na = '张三'
上記のエラーがまだ存在することがわかったので、where句を削除して実行します。エラーメッセージに['student.na' line、unrecognized]と表示され、非常に困惑していますが、前のテーブル名「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 -あなたは、FROM句に更新する目標table'class'を指定することはできません
それはあなたが最初に同じテーブルに特定の値を選択し、(同じ文で)テーブルを更新することができないことを意味し、
それはの値であり、フィールドが判断され、フィールドの値が更新されます。
インターネットで調べたところ、MySQLはこの種の操作をサポートしていないことがわかりました。すべて「巻き上げ」によって解決され
ます(https://zhidao.baidu.com/question/68619324.htmlから)。
解決策1:1つ
より多くのレベルのネストサブクエリ、次に削除、
プラン2:
1。一時リターンテーブルを作成し、削除する条件を一時テーブルに自動的に保存します
。2。一時テーブルに従ってメインテーブルデータを
削除します。3。最後に一時テーブル:
別のテーブルを作成したくないので、オプション1を使用しました。
UPDATE test.student class
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') )
WHERE
na = '张三'
[(SELECT class from(____))]の外側にレイヤーをネストしました
3.しかし、別の問題があります-1248:
(私が言ったように、この欲求不満はあまりにも頻繁に起こります、デザインはとても直感的でエラーが発生しやすいです、プログラマーが髪を失うのも不思議ではありません)
1248-すべての派生テーブルは
検索を続ける独自のエイリアスを持っている必要があります...答えを見つける:https:/ / blog.csdn.net/cao478208248/article/details/28122113
"この文は、各派生テーブルに独自のエイリアスが必要であることを意味します...サブクエリの結果は次のとおりです。派生テーブルは上位レベルのクエリに使用されるため、サブクエリの結果にはエイリアスが必要です "
だから私は[tとして]模倣して追加しました
UPDATE test.student class
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') as t )
WHERE
na = '张三'
ついに正常に実行されました!