【发布时间】:2019-06-08 22:20:59
【问题描述】:
老师希望我们讨论如何为全球业务实现收据数据库的“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() 函数来生成 COMPOSITE PRIMARY KEY 并避免担心达到上限 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 吗?我错过了什么?
【问题讨论】:
-
谢谢@Shadow。 *Custom SERIAL / autoincrement per group of values:专注于 SQL 的 Postgre 风格。我的班级使用 MySQL。 *MySQL: Add sequence column based on another field 第三个答案(来自用户“Quassnoi”)向我介绍了触发器,我见过的最诱人的解决方案。 *MySQL auto-increment based on group 提供令人沮丧的建议或感觉太老套的建议。
标签: php mysql sql database-design