假设我有一张这样的table:
Column | Type | Notes
---------+------------ +----------------------------------------------------------
id | integer | An ID that's FK to some other table
seq | integer | Each ID gets its own seq number
data | text | Just some text, totally irrelevant.
字符串id
+ seq
是一个组合键。
我想看到的是:
ID | SEQ | DATA
----+------ +----------------------------------------------
1 | 1 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
1 | 2 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
1 | 3 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
1 | 4 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
2 | 1 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
3 | 1 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
3 | 2 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
3 | 3 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
3 | 4 | Quick brown fox, lorem ipsum, lazy dog, etc etc.
型
正如您所看到的,id
和seq
的组合是唯一的。
我不知道如何设置我的表(或插入语句?)来实现这一点。我想插入id
和data
,导致seq
成为依赖于id
的子序列。
8条答案
按热度按时间q0qdq0h21#
没问题的啦!我们将创建两个表,
things
和stuff
。stuff
将是您在问题中描述的表,things
是它所引用的表:字符串
然后,我们将为
things
设置一个触发器,该触发器将在每次创建行时创建一个新序列:型
现在我们将以
thing_seq_1
,thing_seq_2
等结束。现在,
stuff
上的另一个触发器,以便它每次都使用正确的序列:型
这将确保当行进入
stuff
时,id
列用于查找调用nextval
的正确序列。这里有一个演示:
型
fnatzsnv2#
您可以使用window function来分配
SEQ
值,例如:字符串
3bygqnnd3#
如果
seq
反映(或应该反映)行插入的顺序,我宁愿使用自动填充的timestamp
,并在使用row_number()
选择行时动态生成序列号:字符串
要获取
seq
列,您可以执行以下操作:型
然而,与使用持久化的
seq
列(特别是在id, seq
上有索引)相比,选择会慢一点。如果这成为一个问题,你可以考虑使用物化视图,或者添加
seq
列,然后定期更新它(出于性能原因,我不会在触发器中这样做)。SQLFiddle示例:http://sqlfiddle.com/#!15/db 69 b/1
hujrc8aj4#
只是猜测。
字符串
s4n0splo5#
下面是使用标准SQL的简单方法:
字符串
请参见SQL Fiddle演示。
(If如果你想更聪明一点,你可以考虑创建一个trigger,在插入后立即使用相同的方法更新行。
xt0899hw6#
我同样需要动态存储一个树状结构,而不是一次添加所有的ID。
我不喜欢对每个组使用序列表,因为可能有数千个。
它在密集的多处理环境中运行,因此必须是防竞争条件的。
这里是第一级的插入字体。其他级别遵循相同的原则。
每个组作为独立的不可重用的序列ID,该函数接收组名和子组名,给你现有的ID或创建它并返回新的ID。
我尝试了一个循环来进行单个选择,但代码同样长,更难阅读。
字符串
尝试一下:
型
y1aodyip7#
PostgreSQL支持分组的唯一列,如下所示:
字符串
参见PostgreSQL Documentation-第5.3.3节
简单:-)
sc4hvdpw8#
我没有任何postgresql的经验,但是你能在插入语句中使用子查询吗?比如,在Mysqlish中,
字符串