使用COPY ON CONFLICT覆蓋導(dǎo)入數(shù)據(jù)
AnalyticDB PostgreSQL版支持COPY ON CONFLICT覆蓋導(dǎo)入數(shù)據(jù)。目前COPY ON CONFLICT僅支持全表約束檢查及全列覆蓋寫(xiě)入。
在AnalyticDB PostgreSQL版中,您可以通過(guò)COPY快速導(dǎo)入數(shù)據(jù),但是在COPY導(dǎo)入數(shù)據(jù)的過(guò)程中,如果數(shù)據(jù)與表的約束沖突,COPY任務(wù)會(huì)報(bào)錯(cuò)并終止。AnalyticDB PostgreSQL提供了COPY ON CONFLICT功能,支持在約束沖突時(shí)進(jìn)行覆蓋寫(xiě)入或忽略寫(xiě)入,避免COPY任務(wù)因?yàn)榧s束沖突而失敗。
僅內(nèi)核編譯日期為20210528及以后的AnalyticDB PostgreSQL 6.0版實(shí)例支持COPY ON CONFLICT功能。為了更好地使用該功能,建議您升級(jí)至最新的內(nèi)核版本,升級(jí)內(nèi)核小版本,請(qǐng)參見(jiàn)版本升級(jí)。
使用約束
目標(biāo)表需為堆表,不支持AO表(AO表不支持唯一索引,所以不支持AO表)。
僅V6.3.6.1及以上內(nèi)核版本支持目標(biāo)表為分區(qū)表。如何升級(jí)內(nèi)核版本,請(qǐng)參見(jiàn)版本升級(jí)。
目標(biāo)表不支持Updatable View(可更新視圖)。
COPY ON CONFLICT僅支持COPY FROM,不支持COPY TO。
不支持指定約束索引列,COPY ON CONFLICT默認(rèn)判斷所有約束列。若指定約束索引列,則COPY執(zhí)行失敗,報(bào)錯(cuò)信息如下:
COPY NATION FROM stdin DO ON CONFLICT(n_nationkey) DO UPDATE; ERROR: COPY ON CONFLICT does NOT support CONFLICT index params
不支持指定更新列,COPY ON CONFLICT默認(rèn)更新所有列。若指定更新列,則COPY執(zhí)行失敗,報(bào)錯(cuò)信息如下:
COPY NATION FROM stdin DO ON CONFLICT DO UPDATE SET n_nationkey = excluded.n_nationkey; ERROR: COPY ON CONFLICT does NOT support UPDATE SET targets
語(yǔ)法
COPY table [(column [, ...])] FROM {'file' | STDIN}
[ [WITH]
[BINARY]
[OIDS]
[HEADER]
[DELIMITER [ AS ] 'delimiter']
[NULL [ AS ] 'null string']
[ESCAPE [ AS ] 'escape' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[CSV [QUOTE [ AS ] 'quote']
[FORCE NOT NULL column [, ...]]
[FILL MISSING FIELDS]
[[LOG ERRORS]
SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]
[DO ON CONFLICT DO UPDATE | NOTHING]
COPY ON CONFLICT提供了DO ON CONFLICT DO UPDATE和DO ON CONFLICT DO NOTHING兩個(gè)子句:
DO ON CONFLICT DO UPDATE表示表約束沖突時(shí)全列更新。
DO ON CONFLICT DO NOTHING表示表約束沖突時(shí)忽略輸入內(nèi)容。
示例
創(chuàng)建一個(gè)表NATION,表中包含4列,其中N_NATIONKEY為主鍵列,具有主鍵約束,建表語(yǔ)句如下:
CREATE TABLE NATION ( N_NATIONKEY INTEGER, N_NAME CHAR(25), N_REGIONKEY INTEGER, N_COMMENT VARCHAR(152), PRIMARY KEY (N_NATIONKEY) );
通過(guò)COPY導(dǎo)入部分?jǐn)?shù)據(jù),COPY語(yǔ)句如下:
COPY NATION FROM stdin;
出現(xiàn)>>標(biāo)志后逐條輸入如下內(nèi)容:
0 'ALGERIA' 0 'haggle. carefully final deposits detect slyly agai' 1 'ARGENTINA' 1 'al foxes promise slyly according to the regular accounts. bold requests alon' 2 'BRAZIL' 1 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 'CANADA' 1 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' \.
說(shuō)明復(fù)制以上數(shù)據(jù)時(shí),請(qǐng)將兩列值之間的空格替換為Tab。
查詢NATION表,查看已經(jīng)導(dǎo)入的數(shù)據(jù),查詢語(yǔ)句如下:
SELECT * from NATION;
返回信息如下:
n_nationkey | n_name | n_regionkey | n_comment -------------+---------------------------+-------------+------------------------------------------------------------------------------------------------------------ 2 | 'BRAZIL' | 1 | 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 | 'CANADA' | 1 | 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' 0 | 'ALGERIA' | 0 | ' haggle. carefully final deposits detect slyly agai' 1 | 'ARGENTINA' | 1 | 'al foxes promise slyly according to the regular accounts. bold requests alon' (4 rows)
使用COPY語(yǔ)句導(dǎo)入一行主鍵沖突的數(shù)據(jù),COPY語(yǔ)句如下:
COPY NATION FROM stdin;
出現(xiàn)>>標(biāo)志后逐條輸入如下內(nèi)容:
0 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco' \.
說(shuō)明復(fù)制以上數(shù)據(jù)時(shí),請(qǐng)將兩列值之間的空格替換為Tab。
此時(shí)執(zhí)行會(huì)產(chǎn)生報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容如下:
ERROR: duplicate key value violates unique constraint "nation_pkey" DETAIL: Key (n_nationkey)=(0) already exists. CONTEXT: COPY nation, line 1
使用COPY ON CONFLICT語(yǔ)句,在主鍵沖突的情況下更新數(shù)據(jù),COPY ON CONFLICT語(yǔ)句如下:
COPY NATION FROM stdin DO ON CONFLICT DO UPDATE;
出現(xiàn)>>標(biāo)志后逐條輸入如下內(nèi)容:
0 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco' \.
說(shuō)明復(fù)制以上數(shù)據(jù)時(shí),請(qǐng)將兩列值之間的空格替換為Tab。
此時(shí)COPY語(yǔ)句不會(huì)產(chǎn)生報(bào)錯(cuò)信息,查詢NATION表可以看到主鍵為0的行數(shù)據(jù)已更新,查詢語(yǔ)句如下:
SELECT * FROM NATION;
返回信息如下:
n_nationkey | n_name | n_regionkey | n_comment -------------+---------------------------+-------------+------------------------------------------------------------------------------------------------------------ 2 | 'BRAZIL' | 1 | 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 | 'CANADA' | 1 | 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' 1 | 'ARGENTINA' | 1 | 'al foxes promise slyly according to the regular accounts. bold requests alon' 0 | 'GERMANY' | 3 | 'l platelets. regular accounts x-ray: unusual, regular acco' (4 rows)
使用COPY ON CONFLICT功能,在主鍵沖突的情況下,忽略輸入:
COPY NATION FROM stdin DO ON CONFLICT DO NOTHING;
出現(xiàn)>>標(biāo)志后逐條輸入如下內(nèi)容:
1 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco' \.
說(shuō)明復(fù)制以上數(shù)據(jù)時(shí),請(qǐng)將兩列值之間的空格替換為Tab。
此時(shí)COPY語(yǔ)句不會(huì)產(chǎn)生報(bào)錯(cuò)信息,查詢NATION表可以看到主鍵為1的行數(shù)據(jù)沒(méi)有更新,查詢語(yǔ)句如下:
SELECT * FROM NATION;
返回信息如下:
n_nationkey | n_name | n_regionkey | n_comment -------------+---------------------------+-------------+------------------------------------------------------------------------------------------------------------ 2 | 'BRAZIL' | 1 | 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 | 'CANADA' | 1 | 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' 1 | 'ARGENTINA' | 1 | 'al foxes promise slyly according to the regular accounts. bold requests alon' 0 | 'GERMANY' | 3 | 'l platelets. regular accounts x-ray: unusual, regular acco' (4 rows)