PostgreSQL 兩表關(guān)聯(lián)更新
問題:我需要對目標(biāo)表cq_compliance_question的serial_number字段的值進(jìn)行維護(hù),由于cq_compliance_question數(shù)據(jù)量太大,所以我創(chuàng)建了臨時(shí)表cq_compliance_question_temp來輔助操作。所以,我需要通過這兩張表關(guān)聯(lián)來完成對目標(biāo)表字段serial_number值的維護(hù)。
我采用MySQL的寫法:
UPDATE cq_compliance_question cq,
cq_compliance_question_temp cqt
SET cq.serial_number = cqt.serial_number_2
WHERE
cq."id" = cqt."id"
但是此時(shí)Navicat是報(bào)錯(cuò)的,錯(cuò)誤信息:
[SQL]UPDATE cq_compliance_question cq,
cq_compliance_question_temp cqt
SET cq.serial_number = cqt.serial_number_2
WHERE
cq."id" = cqt."id"
[Err] ERROR: syntax error at or near ","
LINE 1: UPDATE cq_compliance_question cq,
^
說我語法錯(cuò)誤,但這種寫法在MySQL是ok的。
所以我開始對該寫法進(jìn)行修改。
第一次修改:
UPDATE cq_compliance_question cq
SET cq.serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
cq."id" = cqt."id"
報(bào)錯(cuò),錯(cuò)誤信息:
[SQL]UPDATE cq_compliance_question cq
SET cq.serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
cq."id" = cqt."id"
[Err] ERROR: column "cq" of relation "cq_compliance_question" does not exist
LINE 2: SET cq.serial_number = cqt.serial_number_2
^
說在表"cq_compliance_question"中不存在column "cq"。所以我想是表的別名出問題了,去掉表別名試試。
第二次修改:
UPDATE cq_compliance_question
SET serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
"id" = cqt."id"
還是報(bào)錯(cuò),錯(cuò)誤信息:
[SQL]UPDATE cq_compliance_question
SET serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
"id" = cqt."id"
[Err] ERROR: column reference "id" is ambiguous
LINE 6: "id" = cqt."id"
^
說id是不明確的。這就是說無法確定id是屬于哪張表的,那么我對id指明表,再試試。
第三次修改:
UPDATE cq_compliance_question
SET serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
cq_compliance_question."id" = cqt."id"
此時(shí)執(zhí)行就ok:
[SQL]UPDATE cq_compliance_question
SET serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
cq_compliance_question."id" = cqt."id"
時(shí)間: 0.017s
受影響的行: 50
我再試試加上表別名,第四次修改:
UPDATE cq_compliance_question cq
SET serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
cq."id" = cqt."id"
此時(shí)執(zhí)行,也是ok的:
[SQL]UPDATE cq_compliance_question cq
SET serial_number = cqt.serial_number_2
FROM
cq_compliance_question_temp cqt
WHERE
cq."id" = cqt."id"
時(shí)間: 0.037s
受影響的行: 50
問題解決。
可以驗(yàn)證出PostgreSQL在兩表關(guān)聯(lián)更新時(shí),跟MySQL是不一樣的。關(guān)鍵詞set后面的目標(biāo)列名是不能用表名或者表別名來引用的,直接使用列名即可,否則會(huì)出現(xiàn)語法錯(cuò)誤。
當(dāng)然,我還沒有驗(yàn)證set多個(gè)列和where后有多個(gè)聯(lián)合查詢條件的情況。如果出現(xiàn)問題,也可以根據(jù)這個(gè)思路修改來驗(yàn)證。
編者按:本文由弄青春原創(chuàng),如果您喜歡,勞駕您點(diǎn)個(gè)贊,也歡迎您留下寶貴的評論!若要轉(zhuǎn)載,請注明出處!