【发布时间】:2013-08-01 04:12:04
【问题描述】:
在 Postgres 8.4 或更高版本中,获取默认填充的一行数据的最有效方法是而不实际创建行。例如,作为交易(伪代码):
create table "mytable"
(
id serial PRIMARY KEY NOT NULL,
parent_id integer NOT NULL DEFAULT 1,
random_id integer NOT NULL DEFAULT random(),
)
begin transaction
fake_row = insert into mytable (id) values (0) returning *;
delete from mytable where id=0;
return fake_row;
end transaction
基本上,我希望查询具有单行,其中 parent_id 为 1,random_id 是随机数(或其他函数返回值),但我不希望此记录保留在表中或影响主键序列serial_id_seq。
我的选择似乎是使用上面的事务或创建视图,这些视图是添加了假行的表的副本,但我不知道每种方法的所有优缺点或是否存在更好的方法。
我正在寻找一个假设不知道任何列的数据类型或默认值的答案,除了id 或列的数量或顺序。只有表名是已知的,并且表中不应存在 id 为 0 的记录。
在过去,我创建了虚假记录 0 作为永久记录,但我开始将此记录视为一种污染(因为我通常必须将其从未来的查询中过滤掉)。
【问题讨论】:
-
我想要一行,如果我插入它(让默认值填充到数据库中)并立即选择它,但没有使用的开销/复杂性和/或副作用一笔交易(除非交易真的是最好的方式)。
-
对序列的查询是原子的,并且无论您是否回滚事务都会递增。这对您来说可能不是问题,但值得一提。
-
是的,序列可能是个问题。我不希望在序列中产生很多空白。这并不重要,但它确实使调试更容易(了解可能已经存在和删除的记录与从未真正创建的记录之间的区别)。
标签: postgresql