【发布时间】:2013-10-22 09:18:42
【问题描述】:
我将编写几个 MySQL 表来处理发票。
我的计划是将其分为 3 个主要表格:
create table invoice
(
id auto_increment,
client (foreign key),
created (date),
*etc*...
)
create table products
(
id auto_increment
*product info*...
)
create table invoice_products
(
invoice_id (references invoice.id)
row (resetting auto_increment) <--THIS!!!
product_id(references products.id)
product_quantity INT
primary key (invoice_id,row)
)
难题在于,当创建新发票时,invoice.id 是 auto_incremented,这是它应该的。我不希望 invoice_products.row 从每张新发票的 1 开始。 因此,对于每张新发票,行 auto_increment 将从 1 开始,但如果将新行添加到现有发票 ID,则行 ID 将从中断处继续。
关于如何实现这一点的任何建议?
(希望简短版的代码足以让你理解困境)
提前感谢您的任何建议!
编辑:澄清:数据库中的所有表都是 InnoDB(因为大量使用外键约束)
【问题讨论】:
-
我认为您正在尝试混合 数据库设计 和 演示文稿。只需在检索发票行后添加行号,不是吗?
-
MyISAM 引擎可以做到这一点 - 完全符合您的设计 (
primary key (invoice_id,row))。如果您使用 InnoDB,则必须在代码中进行(SQL 或应用程序)。 -
@GuillaumePoussel:唯一的困境是没有办法检查一致性。并且没有可靠的方法来引用发票上的特定行。一张发票可能有多行包含相同的产品,甚至是相同的数量。
-
@ypercube:我选择 InnoDB 的原因是外键支持。
-
我并不是因为这个而暗示你去 MyISAM。 InnoDB 是目前最好的选择 - 正是因为完整性/事务/外键支持,并且因为它正在积极开发。
标签: mysql database-design innodb auto-increment