0

我在以下设置中有 3 个表

CREATE TABLE [dbo].[codevariable] (
    [id] [int] NULL,
    [code] [nchar](10) NULL,
    [variable] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[proxy] (
    [id] [int] NULL,
    [description] [nvarchar](50) NULL,
    [status] [bit] NULL,
    [added] [datetime] NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[wall] (
    [id] [int] NULL,
    [description] [nvarchar](50) NULL
) ON [PRIMARY]

表中的以下值 表墙

1   This is a basic wall
2   This is a medium wall
3   This is an advanced wall

表代理

1   Small Proxy True    2013-05-08 00:00:00.000
2   Medium Proxy    False   2013-05-08 00:00:00.000

表代码变量

1   Proxy       1         
2   Proxy       2         
3   Wall        1         
4   Wall        2         
5   Wall        3      

Owke 现在我面临的问题是,如果我想插入让我们说代理中的新行。然后它会有 ID 3,现在我需要确保 id 3 也存在于代码代理下的 CodeVariable 中!

如果没有外键,则不会检查代码是否存在于代码变量中。

我尝试过使用外键但没有成功。如何在列代码上的 CodeVariable 表和表代理和表墙的变量之间创建链接。

我还可以在唯一的代码和变量上创建索引。但你不能将外键链接到它。

我正在使用 SQL 2008

谢谢

4

1 回答 1

2

一种更改表定义的方法,因此FOREIGN KEY可以强制执行约束。

(codeid, codetype)对表使用复合主键codevariable(重命名code),其中codetype只能采用 2 个可能的值,要么'P'要么'W'
code可以使用您所拥有的而不是,codetype但我更喜欢更窄的列,因为索引中使用了键(主键和外键)。
转换code为计算列):

CREATE TABLE [dbo].[code] (
    [codeid] [int] NOT NULL,
    [codetype] [char](1) NOT NULL,
    [codename] AS                               -- computed column
         CASE codetype WHEN 'P' THEN 'Proxy'
                       WHEN 'W' THEN 'Wall'
         END,
    CONSTRAINT code_PK
        PRIMARY KEY (codeid, codetype),
    CONSTRAINT codetype_CK
        CHECK (codetype IN ('P', 'W'))
) ;

在另外两个表中,codetype也添加了 ,因此(codeid, codetype)可以同时定义为PRIMARYFOREIGN键:

CREATE TABLE [dbo].[proxy] (
    [proxyid] [int] NOT NULL,
    [codetype] [char](1) NOT NULL DEFAULT 'P',
    [description] [nvarchar](50) NULL,
    [status] [bit] NULL,
    [added] [datetime] NULL,
    CONSTRAINT proxy_PK
        PRIMARY KEY (proxyid, codetype),
    CONSTRAINT code_proxy_FK
        FOREIGN KEY (proxyid, codetype)
        REFERENCES code (codeid, codetype),
    CONSTRAINT codetype_proxy_CK
        CHECK (codetype = 'P')
) ;


CREATE TABLE [dbo].[wall] (
    [wallid] [int] NOT NULL,
    [codetype] [char](1) NOT NULL DEFAULT 'W',
    [description] [nvarchar](50) NULL,
    CONSTRAINT wall_PK
        PRIMARY KEY (wallid, codetype),
    CONSTRAINT code_wall_FK
        FOREIGN KEY (wallid, codetype)
        REFERENCES code (codeid, codetype),
    CONSTRAINT codetype_wall_CK
        CHECK (codetype = 'W')
) ;

SQL小提琴

于 2013-05-08T19:46:21.197 回答