Postgresql

使用預設序列將記錄從一個表插入到另一個表

  • January 10, 2022

我有兩個結構相同的表,第一列 gid 作為串列,之後還有許多其他列。我想將選定的行從一個表插入到另一個表。沒有序列,這真的很容易:

insert into all_roads select * from new_roads where add_road = 1;

但是在兩者中將序列作為第一列時,我確實得到了錯誤:

ERROR:  duplicate key value violates unique constraint

我真的不想將序列號從一張表複製到另一張表。我寧願對所有新插入的記錄使用預設序列值。有沒有辦法不寫插入手動列出除第一列之外的所有列 - 串列?

您可以列出您的非gidSELECT

edb=# create table foo (id serial primary key, col1 text, col2 text);
CREATE TABLE
edb=# create table foo_new (id serial primary key, col1 text, col2 text);
CREATE TABLE
edb=# insert into foo values (default, generate_series(1,100)::text,'mytext');
INSERT 0 100
edb=# insert into foo_new values (default, generate_series(1,100)::text,'yourtext');
INSERT 0 100
edb=# insert into foo_new select * from foo where id = 1;
ERROR:  duplicate key value violates unique constraint "foo_new_pkey"
DETAIL:  Key (id)=(1) already exists.
edb=# insert into foo_new (col1, col2) (select col1, col2 from foo where id = 1);
INSERT 0 1
edb=# select * from foo_new where col2 = 'mytext';
id  | col1 |  col2  
-----+------+--------
101 | 1    | mytext
(1 row)

您也可以嘗試創建一個臨時表,然後刪除該gid列,然後將該表複製到新表中:

edb=# create temporary table foo_temp AS SELECT * FROM foo;
SELECT 100
edb=# alter table foo_temp drop column id;
ALTER TABLE
edb=# insert into foo_new (col1, col2) (select col1, col2 from foo);
INSERT 0 100
edb=# select count(*), col2 FROM foo_new group by col2;
count |   col2   
-------+----------
  100 | yourtext
  100 | mytext
(2 rows)

如果您不想手動列出所有列,因為您有太多,我想您可以使用腳本創建所有非gid列的列表,然後複製/粘貼到您的INSERT語句中:

edb=# select array_to_string(ARRAY(SELECT column_name::text
                                    FROM information_schema.columns 
                                   WHERE table_name = 'foo' 
                                     AND column_name::text NOT IN ('id')),',');
array_to_string 
-----------------
col1,col2
(1 row)

有沒有辦法不寫插入手動列出除第一列之外的所有列 - 串列?

基本上,沒有。

在某些時候,您必鬚髮出一個插入語句,告訴它您要提供哪些欄位,並使用一個選擇語句來獲取要放入這些欄位的值。

如何生成插入語句取決於您。

information_schema 用於以標準化術語“描述”您的數據庫 - 您可以查詢該數據庫並將輸出混搭以創建列列表。

如果這是您經常做的事情,您可能會考慮在第二個表上創建一個視圖(省略串列列),授予對該視圖的插入權限 - 是的,您可以這樣做 - 並通過它插入您的數據。

引用自:https://dba.stackexchange.com/questions/253798