PostgreSQL | 數(shù)據(jù)庫語法-兩表關(guān)聯(lián)更新語法

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)載,請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容