如何在这里实现引用完整性



我得到了下面的结构——我承认它不是理想的,但是很多东西都建立在它的基础上,所以我想尽量减少更改。
我不确定如何正确地实现文档和交付地址之间的引用完整性。在这里可以不使用触发器吗?问题是,在Documents中,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

我想你可以像你期望的那样使用外键:

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成为外键引用。

最新更新