【问题标题】:Foreign key constraint with some where clause in SQL ServerSQL Server 中带有某些 where 子句的外键约束
【发布时间】:2017-08-04 00:29:42
【问题描述】:

我有两张表,一张包含accountid, category, code, name, desc 列,另一张包含id, accountid, code, reason, desc, active 列。

有什么方法可以创建一个约束,使第二个表中的code 仅包含第一个表中的code 值,条件为somevalue

【问题讨论】:

  • 取决于您的数据库引擎
  • 这是什么意思? (我是 sql server(ssms)的新手)
  • 请标记您正在使用的数据库。 ty
  • @FerdinandGaspar 你的意思是表的架构
  • FerdinandGaspar 的意思是 将蓝框 sql-server 添加到问题底部的其他蓝框列表中。就像我刚刚为你所做的一样;)

标签: sql sql-server foreign-keys constraints


【解决方案1】:

一个方法就是一个小技巧。首先,在第一个表中的(category, code) 上创建唯一索引:

create unique index unq_table1_category_code on table1(category, code)

然后在table2中创建一个计算列:

alter table table2 add category as ('somevalue') persisted;

然后创建外键关系:

alter table table2 add constraint fk_somevalue_code
    foreign key (category, code) references table1(category, code);

【讨论】:

  • 如果category + code 在引用表中不是唯一的,我认为它不会起作用。虽然,总是可以将父表的 PK 扔进去,只是为了保证唯一性(当然,假设它存在)。
  • @RogerWolf 。 . .如果值不唯一,则无法使用外键。
【解决方案2】:
ALTER TABLE table2 WITH CHECK
  ADD CONSTRAINT CK_table2category CHECK (category = 'somevalue'),
      CONSTRAINT FK_table2code FOREIGN KEY (code) REFERENCES table1 (code);

【讨论】:

  • 这不起作用,sql server 在 where 子句附近抛出错误
  • ALTER TABLE [dbo].[StatusReason] WITH NOCHECK ADD CONSTRAINT [CK_StatusReason_ValueItem] CHECK([Category]='Status'), CONSTRAINT [FK_StatusReason_ValueItem] FOREIGN KEY([StatusCode]) REFERENCES [dbo].[ValueItem] ([Code]) GO ALTER TABLE [dbo].[StatusReason] CHECK CONSTRAINT [CK_StatusReason_ValueItem], [FK_StatusReason_ValueItem] GO
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2017-06-17
  • 1970-01-01
  • 2011-12-11
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多