【问题标题】:Add Foreign Key to information_schema.tables将外键添加到 information_schema.tables
【发布时间】:2016-02-12 10:11:16
【问题描述】:

我想要一个表,其中的列引用另一个表(而不是引用另一个表中的列)。

我使用的是 SQL Server 2008 R2

所以我有 tblA、tblB 和 tblC。 tblA 有一个 varchar 列“OtherTable”。 我想要一个仅允许值“tblA”、“tblB”或“tblC”作为此列中的值的外键约束。

我用普通的外键试了一下

ALTER TABLE dbo.tblA
ADD FOREIGN KEY (OtherTable)
REFERENCES information_schema.tables(TABLE_NAME);

并得到以下错误:

消息 1767,第 16 级,状态 0,第 1 行

外键 'FK__tblA__Tabel__27CED166' 引用无效表 'information_schema.tables'。

消息 1750,第 16 级,状态 0,第 1 行

无法创建约束。查看以前的错误。

我也尝试过检查约束

ALTER TABLE dbo.tblA
ADD CHECK (OtherTable IN (SELECT TABLE_NAME FROM information_schema.tables));

但这也给了我一个错误:

消息 1046,第 15 级,状态 1,第 6 行

在这种情况下不允许子查询。仅标量表达式 是允许的。

有没有可能有这种约束?

【问题讨论】:

  • 如果没有其他方法,请尝试基于触发器的解决方案。

标签: sql tsql sql-server-2008-r2 foreign-keys check-constraints


【解决方案1】:

Information_schema.tables 是视图,不能在外键中引用视图。

【讨论】:

    【解决方案2】:

    构建您自己的允许值列表(用户定义表)并引用它。更好的选择是存储可读值,上面写着“为什么”你必须在其他表中查找数据,例如record type。并查看有关多态数据结构的其他问题 - 在我看来,您正在构建类似的东西。

    并且您应该注意 FK 引用系统表。这些表不是您的应用程序的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2020-03-13
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多