如何为关联的发票与发票项目表创建约束?写法差异答疑
关于发票关联表设计的疑问解答
嘿,我来帮你理清这些疑惑,咱们一步步拆解:
1. 为什么教材先创建「依赖表」(InvoiceLineItems)?
其实你仔细看教材的代码会发现:它创建InvoiceLineItems时并没有添加外键约束,只是先建了表结构和复合主键。因为SQL Server要求外键引用的父表(Invoices)必须先存在,直接在创建子表时加外键的话,先建子表会报错。
教材的写法应该是分两步:先建子表结构,再建父表,最后通过ALTER TABLE给子表补加外键约束。而你的写法是先建父表,再建子表并直接添加外键,这才是更常规、更不易出错的顺序,完全没问题,只是编码步骤的差异而已。
2. 为什么InvoiceID会出现在两张表的主键里?
这是不同表的主键设计逻辑:
- Invoices表:InvoiceID是单字段主键,因为每个发票本身是唯一的,一个InvoiceID对应唯一一张发票,符合主键的唯一性要求。
- InvoiceLineItems表:它用
(InvoiceID, InvoiceSequence)作为复合主键,原因是单张发票可以有多个项目,单独的InvoiceID无法唯一标识子表的某一行(比如InvoiceID=1的发票可能有多个项目)。加上InvoiceSequence(项目序号)后,(发票ID+项目序号)的组合就能唯一确定一个发票项目,完美贴合业务逻辑。
反观你的InvoiceItems表,目前没有设置主键,这是个遗漏!数据库表必须有主键来保证行的唯一性,否则可能出现重复的发票项目数据。你可以选择:
- 模仿教材用复合主键(比如
InvoiceID + 某个唯一的项目标识,比如自定义序号) - 给InvoiceItems加一个自增的
InvoiceItemID作为单字段主键
3. 两种写法的核心差异&关联逻辑梳理
写法差异(非错误类,多为风格/业务字段差异)
- 表命名:教材用
InvoiceLineItems,你用InvoiceItems,只是命名习惯不同,只要语义清晰就没问题。 - 业务字段:教材的子表包含
AccountNo(科目号)、InvoiceLineItemAmount(项目金额)等字段,你的子表是InvoiceItem(项目名称)、ItemPrice(单价),这完全取决于你的业务需求,没有对错。 - 主键命名:教材用
PK_表名的格式,你用PK_InvoicesList,只是命名风格差异,建议统一风格方便维护即可。 - 外键设置:你直接在创建子表时添加了外键,教材的代码里没加(应该是后续补充),外键是保证两张表关联完整性的关键,你的写法在这里是正确的。
两张表的关联逻辑
Invoices是父表,存储发票的整体信息,每个发票有唯一的InvoiceID。InvoiceItems是子表,存储单张发票下的明细项目,通过InvoiceID外键关联到父表的InvoiceID。- 外键的作用是:保证子表中所有的
InvoiceID都能在父表中找到对应的发票,避免出现“无主”的发票项目,维护数据的参照完整性。
给你的小建议
赶紧给InvoiceItems表补上主键,比如用复合主键(适合同一张发票无重复项目名称的场景):
CREATE TABLE InvoiceItems( InvoiceID int NOT NULL, InvoiceItem varchar(50) NOT NULL, ItemPrice money NOT NULL, CONSTRAINT PK_InvoiceItems PRIMARY KEY CLUSTERED (InvoiceID ASC, InvoiceItem ASC), CONSTRAINT FK_Invoices_InvoiceItems FOREIGN KEY (InvoiceID) REFERENCES Invoices(InvoiceID) )
或者如果允许同一张发票有相同名称的项目,就加自增ID作为主键:
CREATE TABLE InvoiceItems( InvoiceItemID int IDENTITY(1,1) NOT NULL, InvoiceID int NOT NULL, InvoiceItem varchar(50) NOT NULL, ItemPrice money NOT NULL, CONSTRAINT PK_InvoiceItems PRIMARY KEY CLUSTERED (InvoiceItemID ASC), CONSTRAINT FK_Invoices_InvoiceItems FOREIGN KEY (InvoiceID) REFERENCES Invoices(InvoiceID) )
内容的提问来源于stack exchange,提问作者Morph
相关产品推荐
相关产品推荐

