1

我有一个类似的表:

    CREATE TABLE [dbo].[Table1](
[Option_PK] [bigint] IDENTITY(1,1) NOT NULL,
[Option_1] [varchar](10) NULL,
[Option_2] [varchar](10) NULL,
[Option_3] [varchar](10) NULL)

我正在尝试做的是添加一个表驱动的约束,它可以有效地限制每列的有效条目。例如,如果我制作了第二张桌子:

    CREATE TABLE [dbo].[Table2](
    [FK_Name] [varchar](10) NOT NULL,
    [FK_Value] [varchar](10) NOT NULL)

然后我想检查存储在 Table1 列“Option_1”中的值是否存在于 Table2 列“FK_Value”中,其中“FK_Name”的值为“Option_1”。

这可以通过支票或 FK 实现吗?

** 编辑以使列数据类型匹配;我手动输入了示例表声明和错字,这与问题无关。我知道如何进行 FK,但我不知道如何像我所描述的那样进行 FK。

4

2 回答 2

2

你能不能只有 3 张桌子和 3 个 FK?
FK 需要匹配类型。

CREATE TABLE [dbo].[Option1]([FK_Value] [nchar](10) NOT NULL)
CONSTRAINT [PK_Option1] PRIMARY KEY CLUSTERED ([FK_Value] ASC)

ALTER TABLE [dbo].[Table1]  WITH CHECK ADD  CONSTRAINT [FK_Table1_Option1] FOREIGN KEY([Option_1])
REFERENCES [dbo].[Table2] ([FK_Value])
GO

或者你可以有一列 Option1 默认为 option1
我尝试在 Option1 的值中硬编码但不会去。

ALTER TABLE [dbo].[FKtest1]  WITH CHECK ADD  CONSTRAINT [FK_FKtest1_FKtest1] FOREIGN KEY([Option1],[ValueFK])
REFERENCES [dbo].[FKtest1FK] ([PKoption],[PKvalue])
GO
于 2013-01-21T21:31:30.487 回答
0
CREATE TABLE [dbo].[Table1](
   [Option_PK] [bigint] IDENTITY(1,1) NOT NULL,
   [Option_1] [varchar](10) NULL,
   [Option_1_FK] [varchar](8) NOT NULL DEFAULT 'OPTION_1',
   [Option_2] [varchar](10) NULL,
   [Option_2_FK] [varchar](8) NOT NULL DEFAULT 'OPTION_2',
   [Option_3] [varchar](10) NULL,
   [Option_3_FK] [varchar](8) NOT NULL DEFAULT 'OPTION_3'
)

CREATE TABLE [dbo].[Options](
   [FK_Name] [nchar](8) NOT NULL,
   [FK_Value] [nchar](10) NOT NULL,
   CONSTRAINT [PK_Option1] PRIMARY KEY CLUSTERED ([FK_Name], [FK_Value] ASC)
)

ALTER TABLE [dbo].[Table1] WITH CHECK ADD 
   CONSTRAINT [FK_Table1_Option1] FOREIGN KEY([Option_1], [Option_1_FK) REFERENCES [dbo].[Options] ([[FK_Value], [FK_Name])
   CONSTRAINT [FK_Table1_Option2] FOREIGN KEY([Option_2], [Option_2_FK) REFERENCES [dbo].[Options] ([[FK_Value], [FK_Name])
   CONSTRAINT [FK_Table1_Option3] FOREIGN KEY([Option_3], [Option_3_FK) REFERENCES [dbo].[Options] ([[FK_Value], [FK_Name])
GO

这是未经测试的,未标准化的和丑陋的。您可能应该添加约束以确保 的值Option_X_FK不会改变。实际上,这是 T-SQL,您可能可以为此使用计算列,但我不确定是否允许将它们包含在外键中。

于 2013-11-01T11:53:26.507 回答