在两列中存储相同的序列值

Sad*_*han 3 postgresql postgresql-9.3

我有一个表,其中一列是自动递增序列号。我也希望将相同的值存储在另一列中(以便以后可以更改)。

我的表结构是这样的:

CREATE TABLE Test
(
    test_id integer NOT NULL DEFAULT nextval('test_id_seq'::regclass),
    ...
    ...
    uid integer not null DEFAULT currval('test_id_seq'::regclass),
)
Run Code Online (Sandbox Code Playgroud)

我想要uid = test_id但问题是在一个会话中插入多行时。然后currval不采取正确的ID。

我不想使用触发器。我该如何管理?

Dan*_*ité 5

为了完全不依赖currval,您可以按照以下模式以系统方式转换 INSERT 查询:

  • 从选择插入,而不是:

    INSERT INTO Test(columns) SELECT columns FROM...;

    考虑这种形式:

    INSERT INTO Test(test_id, uid, columns) 
    SELECT pk,pk,columns FROM
    (SELECT nextval('test_id_seq') as pk, columns FROM ...) AS alias;
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于VALUES子句中的单行,而不是

    INSERT INTO Test(columns) VALUES(...values here...)
    
    Run Code Online (Sandbox Code Playgroud)

    考虑:

    INSERT INTO Test(test_id, uid, columns...) 
    SELECT pk,pk,columns FROM
     (SELECT nextval('test_id_seq') as pk, ...values here...) AS alias;
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于具有多行的 VALUES 子句,而不是:

    INSERT INTO Test(columns) VALUES(...values1...),(...values2...)
    
    Run Code Online (Sandbox Code Playgroud)

    考虑:

     WITH v(columns...) AS ( VALUES(...values1...),(...values2...) )
     INSERT INTO Test(test_id, uid, columns) 
     SELECT pk,pk,columns... FROM
      (SELECT nextval('test_id_seq') as pk, v.columns... FROM v) AS alias;
    
    Run Code Online (Sandbox Code Playgroud)

如果 PostgreSQL 有一个符合标准的 NEXTVAL,你可以不用子查询而只使用类似的东西:

INSERT INTO ... SELECT NEXT VALUE FOR seqname,
                       NEXT VALUE FOR seqname,
                       other columns...
Run Code Online (Sandbox Code Playgroud)

并且NEXT VALUE FOR seqname按照标准的规定,对于同一输出行的两列,将评估为相同的值。但是 PostgreSQL 没有这个结构。