在 SQLite 中自动增加复合键
Autoincrement a composite key in SQLite
我正在尝试创建一个使用复合主键的 table。这个想法是我们有一个订单“编号”(字符串)和一个行号(整数)。当插入table时,顺序号是已知的,但没有已知或指定的行号;我希望它自动生成为该订单号的最低行号。
我试过使用复合主键(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
在table中插入这些行后,应该是
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
:
计算 table 的行数
INSERT INTO tablename(orderNumber, lineNumber, SKU, ....)
SELECT 'abc123', COALESCE(MAX(lineNumber), 0) + 1, 'xyz', ....
FROM tablename
WHERE orderNumber = 'abc123';
参见demo。
我正在尝试创建一个使用复合主键的 table。这个想法是我们有一个订单“编号”(字符串)和一个行号(整数)。当插入table时,顺序号是已知的,但没有已知或指定的行号;我希望它自动生成为该订单号的最低行号。
我试过使用复合主键(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 |
在table中插入这些行后,应该是
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
:
INSERT INTO tablename(orderNumber, lineNumber, SKU, ....)
SELECT 'abc123', COALESCE(MAX(lineNumber), 0) + 1, 'xyz', ....
FROM tablename
WHERE orderNumber = 'abc123';
参见demo。