使用SELECT插入序列表

时间:2018-07-31 19:08:07

标签: postgresql insert

在Postgres中,我有一个包含许多列的表(例如t1(a,b,c,...,z))。我需要通过select-from-where语句获取其子集到新表中(例如t2),但是该新表必须具有serial属性。因此,t2会喜欢t2(id,a,b,c,...,z),其中id为serial属性。在Postgres中,这有效:

INSERT INTO t2(a, b, c, d, ..., z)
SELECT * 
FROM t1 
WHERE <condition>

但是,可以在不编写t1的所有属性的情况下实现相同的功能吗?

2 个答案:

答案 0 :(得分:1)

您可以将视图定义为除SELECT列之外的所有视图中的简单serial

此类视图在PostgreSQL中是可更新的,因此您可以将其用作INSERT的目标。

答案 1 :(得分:0)

除了Laurenz的回答外,值得注意的是,您可以在插入序列中为序列中的每个记录调用下一个值。

您可以用两种不同的方法来做到这一点。第一个要求您知道序列的名称。默认情况下,串行序列的命名约定为tablename_id_seq,其中tablename在这种情况下为t2

INSERT INTO t2
SELECT
    nextval('t2_id_seq')
  , t1.*
FROM t1

您还可以使用DEFAULT隐式调用串行函数。

INSERT INTO t2
SELECT
    DEFAULT
  , t1.*
FROM t1

有关处理序列的更多详细信息:

自动生成的序列将遵循模式${table}_${column}_seq

您可以通过运行以下查询找到所有序列:

/* Version 10+ */
SELECT
  *
FROM pg_sequences -- Not to be confused with `pg_sequence`
WHERE sequencename LIKE '%t2%'
;

/* Version 9.5+ */
-- Returns the sequences associated with a table
SELECT 
  pg_get_serial_sequence('schema.tablename', 'columnname')
;

-- Returns sequences accessible to the user, not those owned by the user
SELECT
  *
FROM information_schema.sequences
WHERE sequence_name LIKE '%t2%'
;

-- Return sequences owned by the current user
SELECT 
  n.nspname AS sequence_schema, 
  c.relname AS sequence_name,
  u.usename AS owner
FROM pg_class c 
  JOIN pg_namespace n ON n.oid = c.relnamespace
  JOIN pg_user u ON u.usesysid = c.relowner
WHERE c.relkind = 'S'
  AND u.usename = current_user;

/* Version 8.1+ */
-- Returns sequences accessible to the user, not those owned by the user
SELECT 
  relname
FROM pg_class
WHERE relkind = 'S' -- 'S' for sequence
;