Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 作为多值外键引用的主键?_Sql_Database_Sqlite - Fatal编程技术网

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

谢谢你的链接。关于需要创建唯一索引以引用不属于主键的外键的部分非常有用。实际上,我现在想得太远了,因为我现在只生成一个概念模型,稍后将进一步使用一个逻辑模型。是的,我最好的办法是创建额外的表来处理这个问题。这是我处理多值属性的唯一方法。