Sql 作为多值外键引用的主键?
我想知道是否可以将主键从一个表传递到另一个表,并使其在该表中具有多值性,然后在另一个表中将其作为复合外键引用 情况是这样的:我有一个Sql 作为多值外键引用的主键?,sql,database,sqlite,Sql,Database,Sqlite,我想知道是否可以将主键从一个表传递到另一个表,并使其在该表中具有多值性,然后在另一个表中将其作为复合外键引用 情况是这样的:我有一个Services表,每个服务都有一个serviceCode主键和一个serviceFee分配给它 服务用于预约,一次预约最多可使用5项服务。预约产生的发票也需要服务费来计算总费用 到目前为止,我的模式是: 服务(服务代码、说明、服务费) 预约([appDate,clientNo,serviceCode]PK,roomNo) 发票(发票编号、发票日期、总费用、备注、
Services
表,每个服务都有一个serviceCode
主键和一个serviceFee
分配给它
服务用于预约,一次预约最多可使用5项服务。预约产生的发票也需要服务费来计算总费用
到目前为止,我的模式是:
(服务代码、说明、服务费)服务
([appDate,clientNo,serviceCode]PK,roomNo)预约
(发票编号、发票日期、总费用、备注、状态、[appDate、客户编号、服务代码]FK)发票
serviceFee
作为服务主键的一部分,这样我就可以将其传递给发票,因为我不确定是否可以单独将serviceFee
传递给发票
我脑子里想的另一个解决方案是将约会变成一个复杂的关系,因为appDate是它唯一的属性,其他所有东西都是从其他表中引用的。然后,我将把所有内容都传递给发票。是的,您可以将组合键设置为PK和FK 转到并查找“复合外键约束” 但是,您需要考虑的第一件事是:您的表格设计中存在一个大问题。你应该避免复合PK。
您应该使用一个字段作为主键,它可能是IDENTIY、GUID或其他任何内容。就您的情况而言,这种设计会给您带来很大的麻烦我对SQLLITE不太确定。在SQL Server中,您可以这样做
CREATE TABLE [dbo].[service](
[serviceCode] [int] IDENTITY(1,1) NOT NULL,
[description] [varchar](max) NULL,
[servicefee] [float] NULL,
CONSTRAINT [PK__service__3213E83F014935CB] PRIMARY KEY CLUSTERED
(
[serviceCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[appointment](
[appDate] [datetime] NOT NULL,
[clientNo] [int] NOT NULL,
[serviceCode] [int] NOT NULL,
[roomNo] [float] NOT NULL,
CONSTRAINT [PK__appointment__3213E83F014935CB] PRIMARY KEY CLUSTERED
(
[serviceCode] ASC,
[appDate] ASC,
[clientNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[invoice](
(invNo, invDate, totalFee, comment, status, [appDate, clientNo, serviceCode]FK
[invDate] [datetime] not NULL,
[invNo] [int] not NULL,
[totalFee] [float] not null,
[comment] [varchar](max),
[status] [varchar](max),
[appDate] [datetime] NULL,
[clientNo] [int] NULL,
[serviceCode] [int] NULL
) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_appointment_service] Script Date: 04/13/2016 10:43:41 ******/
ALTER TABLE [dbo].[appointment] WITH CHECK ADD CONSTRAINT [FK_appointment_service] FOREIGN KEY([serviceCode])
REFERENCES [dbo].[service] ([serviceCode])
GO
ALTER TABLE [dbo].[appointment] CHECK CONSTRAINT [FK_appointment_service]
GO
/****** Object: ForeignKey [FK_invoice_appointment] Script Date: 04/13/2016 10:43:41 ******/
ALTER TABLE [dbo].[invoice] WITH CHECK ADD CONSTRAINT [FK_invoice_appointment] FOREIGN KEY([serviceCode], [appDate], [clientNo])
REFERENCES [dbo].[appointment] ([serviceCode], [appDate], [clientNo])
GO
ALTER TABLE [dbo].[invoice] CHECK CONSTRAINT [FK_invoice_appointment]
GO
谢谢你的链接。关于需要创建唯一索引以引用不属于主键的外键的部分非常有用。实际上,我现在想得太远了,因为我现在只生成一个概念模型,稍后将进一步使用一个逻辑模型。是的,我最好的办法是创建额外的表来处理这个问题。这是我处理多值属性的唯一方法。