Postgresql
使用預設序列將記錄從一個表插入到另一個表
我有兩個結構相同的表,第一列 gid 作為串列,之後還有許多其他列。我想將選定的行從一個表插入到另一個表。沒有序列,這真的很容易:
insert into all_roads select * from new_roads where add_road = 1;
但是在兩者中將序列作為第一列時,我確實得到了錯誤:
ERROR: duplicate key value violates unique constraint
我真的不想將序列號從一張表複製到另一張表。我寧願對所有新插入的記錄使用預設序列值。有沒有辦法不寫插入手動列出除第一列之外的所有列 - 串列?
您可以列出您的非
gid
列SELECT
: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 用於以標準化術語“描述”您的數據庫 - 您可以查詢該數據庫並將輸出混搭以創建列列表。
如果這是您經常做的事情,您可能會考慮在第二個表上創建一個視圖(省略串列列),授予對該視圖的插入權限 - 是的,您可以這樣做 - 並通過它插入您的數據。