【问题标题】:How to implement referential integrity here?如何在这里实现参照完整性?
【发布时间】:2013-06-14 17:05:07
【问题描述】:

我得到了以下结构 - 我承认这并不理想,但在此基础上构建了很多东西,所以我想尽量减少更改。
我不确定如何正确在文档和交付地址之间实现参照完整性。可以在这里完成而不使用触发器吗?问题是在文档中 addressNum 有时可能为 Null。

CREATE TABLE [dbo].[Clients](
    [IdClient] [varchar](10) NOT NULL,
    [Nom] [varchar](40) NULL
    CONSTRAINT PK_Clients PRIMARY KEY (IdClient))
GO

CREATE TABLE [dbo].[ClientsDelivAdr](
    [IdClient] [varchar](10) NOT NULL,
    [AdrNum] [tinyint] NOT NULL,
    [Adresse] [varchar](200) NULL
 CONSTRAINT [PK_ClientsAdrLivr] PRIMARY KEY (IdClient, AdrNum))

CREATE TABLE [dbo].[Documents](
    [DocID] [int] IDENTITY(1,1) NOT NULL,
    [NoDoc] [char](9) NULL,
    [IdClient] [varchar](10) NULL,
    [AdrNum] [tinyint] NULL,
    [DateDoc] [smalldatetime] NOT NULL,
 CONSTRAINT [PK_DocID] PRIMARY KEY (DocId)) 

有些客户有多个送货地址,有些则没有。
所以数据看起来像这样:

Clients
Id   Name     Address 
---  ----     -------
AA   ClientA  addressA
BB   ClientB  qddressB
CC   ClientC  addressC


DeliveryAdresses
Client  Adr   Address
------  ---   -------
AA      1     shop1
AA      2     shop2
CC      1     shopx

Documents
DocId   Client  Addr  OrderDate
------- ------  ----  --------
1001    CC      1     5/5/2013
1002    AA      1     5/5/2013
1003    BB     (Null) 5/5/2013

【问题讨论】:

  • 你想强制执行什么?
  • 我本来打算对此大发雷霆,但现在 Damien 参与其中,我想我不会打扰 :)
  • 主要防止删除至少使用过一次的送货地址。

标签: sql-server database-design


【解决方案1】:

我认为您可以按预期使用外键:

CREATE TABLE [dbo].[Documents](
    [DocID] [int] IDENTITY(1,1) NOT NULL,
    [NoDoc] [char](9) NULL,
    [IdClient] [varchar](10) NULL,
    [AdrNum] [tinyint] NULL,
    [DateDoc] [smalldatetime] NOT NULL,
 CONSTRAINT [PK_DocID] PRIMARY KEY (DocId),
CONSTRAINT FK_DOC_Clients FOREIGN KEY (IdClient)
     references Clients (IdClient),
CONSTRAINT FK_Doc_Addresses FOREIGN KEY (IdClient,AdrNum)
     references DeliveryAddresses (IdClient,AdrNum) ) 

如果外键引用端的一个或多个列值为NULL,则不检查外键约束。相反,没有办法让NULL 成为外键引用。

【讨论】:

  • 看起来不错。我不知道你的评论。我会及时通知您,非常感谢。
  • @iDevlop BTW,这种强制外键的方法称为 MATCH SIMPLE 但有others。 MATCH SIMPLE 在实践中往往最有用,并且是大多数 DBMS 的默认设置(通常也是唯一支持的)。
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2010-09-26
  • 2013-09-14
相关资源
最近更新 更多