【问题标题】:Foreign key or link between part of column selection部分列选择之间的外键或链接
【发布时间】:2013-05-03 03:18:35
【问题描述】:

我在以下设置中有 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,现在我需要确保在代码Proxy下的CodeVariable中也存在id 3!

没有外键就无法检查代码是否存在于代码变量中。

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

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

我正在使用 SQL 2008

谢谢

【问题讨论】:

  • 是的,您可以将 FK 链接到复合唯一性。但是您必须链接到整个密钥。并且类型必须相同。为什么沃尔甚至在问题中?
  • 这是否意味着我必须添加代理和墙表附加列?这意味着啸叫列将具有相同的值。

标签: sql-server-2008 tsql indexing foreign-key-relationship create-table


【解决方案1】:

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

对表 codevariable(重命名为 code)使用复合主键 (codeid, codetype),其中 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-Fiddle

【讨论】:

  • 谢谢,这工作做得很完美:)
猜你喜欢
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2020-12-18
  • 2014-06-13
相关资源
最近更新 更多