gpt4 book ai didi

postgresql - 如何在一个表中创建多个序列?

转载 作者:太空狗 更新时间:2023-10-30 01:55:34 27 4
gpt4 key购买 nike

我有一张“收据”表。我有列 customer_id(谁有收据)和 receipt_number。每个客户的 receipt_number 应该从 1 开始,并且是一个序列。这意味着 customer_id 和 receipt_number 将是唯一的。我怎样才能优雅地做到这一点。我可以将内置序列功能与 CREATE SEQUENCE 或类似功能一起使用吗?看来我必须为每个客户创建一个序列,这当然不是一个优雅的解决方案。

编辑:必须有一个线程安全和白痴安全的方法来做到这一点。这应该是一个非常简单/常见的需求。

最佳答案

SEQUENCE 不保证没有间隙。例如,一项交易可能会生成一个新数字然后中止(由于错误或电源故障或其他原因......)。下一笔交易将盲目地获得下一个数字,而不是“丢失”的数字。

如果您的客户端应用程序首先不依赖于“无间隙”假设,那将是最好的。但是,您可以像这样最大限度地减少差距:

  1. SELECT MAX(receipt_number) FROM receipts WHERE customer_id = :ci
  2. INSERT INTO receipts(customer_id, receipt_number) VALUES (:ci, aboveresult+1),或者如果返回 step 1 则只插入 1空。
  3. 如果第 2 步返回 PK 违规*,请从头重试。

* 因为并发事务经历了相同的过程并提交。

只要行只是添加而不是删除,这应该可以防止任何间隙,即使在并发环境中也是如此。


顺便说一句,您可以像这样“压缩”步骤 1 和 2:

INSERT INTO receipts (customer_id, receipt_number)
SELECT :ci, COALESCE(MAX(receipt_number), 0) + 1
FROM receipts
WHERE customer_id = :ci;

[SQL Fiddle]

PK {customer_id, receipt_number} 下的索引应确保有效满足此查询的 SELECT 部分。

关于postgresql - 如何在一个表中创建多个序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com