在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的所有属性的情况下实现相同的功能吗?
答案 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
;