【问题标题】:Autoincrement a composite key in SQLite在 SQLite 中自动增加复合键
【发布时间】:2021-08-18 17:12:18
【问题描述】:

我正在尝试创建一个使用复合主键的表。这个想法是我们有一个订单“数字”(字符串)和一个行号(整数)。插入表格时,订单号是已知的,但没有已知或分配的行号;我希望它自动生成为该订单号的最低行号。

我尝试使用复合主键(orderNumber,lineNumber)并将 lineNumber 设置为 NULL,无论是否将 lineNumber 字段设置为 NOT NULL。我也尝试过在 lineNumber 上使用 AUTOINCREMENT,但是,这只会给我一个语法错误。

我正在编写的程序使用 c++,所以我的意思是最坏的情况,我可以自己查询 orderNumber 并在插入一行之前计算要插入的 lineNumber,但这似乎不是最佳选择。有什么建议吗?

示例数据:

orderNumber SKU etc
abc123 xyz etc
def456 xyz etc
abc123 wxc etc
ghi645 wxc etc
abc123 hk4 etc
def456 hk4 etc

在表中插入这些行后,应该是

orderNumber lineNumber SKU etc
abc123 1 xyz etc
def456 1 xyz etc
abc123 2 wxc etc
ghi645 1 wxc etc
abc123 3 hk4 etc
def456 2 hk4 etc

【问题讨论】:

  • 发布样本数据和预期结果以阐明您想要什么。
  • 您希望将其作为表格中的新列吗?如果删除一行会发生什么?这应该通过 SELECT 查询来完成。另外,您是否有一列表示行的顺序?表是无序的数据集。没有第一行、下一行、上一行或最后一行。
  • 嗯嗯嗯,这是一个全新的数据库,所以我猜它会是一个新的专栏?不知道你的意思是什么。如果删除了一行,最好使用现在删除的行号,但如果这太难了,那么只使用最高行之后的下一行就可以了。我不明白为什么行顺序的列很重要 - 这将由选择查询的排序处理。
  • 我猜你的建议是在插入时,为 orderNumber 运行 select 语句,从集合中获取最高的连续 lineNumber,将其增加 1,然后插入?我希望有比这样做更有效的方法,但如果这是必须发生的,那就是它的样子。
  • 我的意思是,如果您删除带有 (abc123, 2) 的行,您将留下 (abc123,1) 和 (abc123,3) 行。

标签: sqlite max sql-insert


【解决方案1】:

没有自动的方法来执行此操作,例如自动增量列。

您可以使用SELECT 语句插入每一行,该语句计算具有相同orderNumber 的表的行数:

INSERT INTO tablename(orderNumber, lineNumber, SKU, ....)
SELECT 'abc123', COALESCE(MAX(lineNumber), 0) + 1, 'xyz', .... 
FROM tablename 
WHERE orderNumber = 'abc123';

请参阅demo

【讨论】:

  • 如果一行被删除,使用 COUNT(*) + 1 不会产生错误吗?用 MAX(*) + 1 替换它会起作用吗?
  • @Merddyn 这就是为什么我在 cmets 中询问删除一行时是否会出现问题。我将使用 MAX() 进行编辑并在演示中检查结果。
  • 哦,这很奇怪,我不知道你可以嵌套这样的 SQL 语句。让我确保我理解正确的语法 - SELECT 'abc123', COALESCE(MAX(lineNumber), 0) + 1, 'xyz', .... FROM tablename WHERE orderNumber = 'abc123';返回一行“abc123”(where 语句中订单“abc123”的最高行号的第一个非空值,如果没有,则返回 0)+1,“xyz”,然后调用 INSERT INTO 函数正在传递该行中的值(每列是一个单独的参数)?
  • @Merddyn 是的,这就是它的工作原理。由于聚合函数 MAX(),SELECT 语句总是准确返回 1 行。
  • 哦,我试图通过投票来做到这一点,但没有注意到复选标记。谢谢你的帮助!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2014-03-18
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多