<分区>
老师要我们讨论如何实现全局业务收据数据库的'line_item'表。 他希望我们讨论这种“行项目”表的主要(复合?)键。如果我们的全局业务每分钟打印数千张收据(包含数百件元素),那么我们需要考虑多少达到 line_item_id 的 INT 上限的可能性?有没有更有效的方法来处理 line_item id?
“注意:编号中的间隙(通常由删除引起)是可以的。还要寻找可能的竞争条件。”
考虑一下:您添加了 3 张收据,每张收据包含 3 件商品。您删除了第三张收据的第二项。然后在第三张收据中添加一个新项目。
所以我想象这样的事情开始:(收据 #1 和 #3 在添加/删除练习之前最初是相同的。注意 #3 上的编号。)
| receipt_id (FK) | line_id (INT) | line_text (TINYTEXT) |
---------------------------------------------------------------------
| 1 | 1 | 'Apple' |
| 1 | 2 | 'Banana' |
| 1 | 3 | 'Coconut' |
---------------------------------------------------------------------
| 2 | 1 | 'Apple' |
| 2 | 2 | 'Apple' |
| 2 | 3 | 'Apple' |
---------------------------------------------------------------------
| 3 | 1 | 'Apple' |
| 3 | 3 | 'Coconut' |
| 3 | 4 | 'Dates' |
---------------------------------------------------------------------
我们一直在学习 SQL 和 PHP(如果这很重要,innoDB 中的 mySQLi。) 不过我觉得这可能仅用 SQL 就可以完成,对吧?
看来我应该使用第二列中的 MAX() 函数来制作复合主键,以避免担心达到上限 INT 阈值。
我正在尝试编造一个 MySQL INSERT,它将对收据行的编号进行动态处理,例如:
INSERT INTO line_item (3, VALUES MAX(receipt_line)+1, 'Dates')
最后他有其他想法,例如:“如果您现在在第二张收据的末尾删除并添加一个项目怎么办?”
我想这些是他正在寻找的操作:
-- Delete the last line of the second receipt
DELETE FROM line_item WHERE receipt_id=2 AND line_id=MAX(line_id)
-- Add a new line to the second receipt.
INSERT INTO line_item VALUES ( 2, MAX(line_id)+1, 'Watermelon')
我期望这样的结果:
| receipt_id (FK) | line_id (INT) | line_text (TINYTEXT) |
---------------------------------------------------------------------
| 1 | 1 | 'Apple' |
| 1 | 2 | 'Banana' |
| 1 | 3 | 'Coconut' |
---------------------------------------------------------------------
| 2 | 1 | 'Apple' |
| 2 | 2 | 'Apple' |
| 2 | 3 | 'Watermelon' |
---------------------------------------------------------------------
| 3 | 1 | 'Apple' |
| 3 | 3 | 'Coconut' |
| 3 | 4 | 'Dates' |
---------------------------------------------------------------------
但是我得到了一堆错误和奇怪的结果。
我是否需要使用 PHP 来计算 line_id?我错过了什么?