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。
我不想使用触发器。我该如何管理?
为了完全不依赖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 没有这个结构。
| 归档时间: |
|
| 查看次数: |
2838 次 |
| 最近记录: |