1

我有一个看起来像这样的表:

CREATE TABLE A (
  A_UNIQUE_ID int NOT NULL PRIMARY KEY,
  A_OTHER_ID int NOT NULL,
  A_CURRENT_FL bit NOT NULL )

它具有与此类似的值

INSERT INTO TABLE A VALUES (1, 1, 0);
INSERT INTO TABLE A VALUES (2, 1, 0);
INSERT INTO TABLE A VALUES (3, 1, 1);

我想像这样创建另一个表 B

CREATE TABLE B (
  B_UNIQUE_ID int NOT NULL PRIMARY KEY,
  A_OTHER_ID int NOT NULL)

whereB.A_OTHER_ID被限制为 A 中的唯一行。所以B.A_OTHER_ID = A.A_OTHER_ID AND A.CURRENT_FL = 1. 这可能与某种类型的检查约束设置吗?非常感谢示例。

4

2 回答 2

0

好的开始,您需要对表 A 进行约束以使其独一无二,如上所述。使用这个答案,您可以创建一个函数并在新的检查约束中调用它。例如:

CREATE FUNCTION Check_A_CURRENT_FL_Count(@Id INT) RETURNS INT AS 
BEGIN
  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM A WHERE A_OTHER_ID = @Id AND A_CURRENT_FL = 1;
  RETURN @ret;
END
GO

alter table A add constraint [CK_A] CHECK (NOT (dbo.Check_A_CURRENT_FL_Count(A_OTHER_ID) > 1 AND A_CURRENT_FL = 1))
GO

然后,如果我正确理解了您想要的内容-您可以在表 B 的检查约束中使用相同的函数。虽然显然您使用的是人为的示例,但不完全确定这样做的目的是什么。如果您想要表 A 中的唯一 ID 列表 - 您可以使用 A_OTHER_ID 作为表 B 中的主键,并去掉 B_UNIQUE_ID?

于 2012-09-07T07:39:41.463 回答
0

您可以使用一些计算列来做到这一点,但它看起来不是很漂亮:

CREATE TABLE A (
  A_UNIQUE_ID int NOT NULL PRIMARY KEY,
  A_OTHER_ID int NOT NULL,
  A_CURRENT_FL bit NOT NULL,
  OTHER_XREF as CASE WHEN A_CURRENT_FL = 1 THEN A_OTHER_ID END persisted,
  UNIQ as CASE WHEN A_CURRENT_FL = 0 THEN A_UNIQUE_ID ELSE 0 END persisted 
  constraint UQ_OTHER_XREF UNIQUE (OTHER_XREF,UNIQ)
  )

INSERT INTO A VALUES (1, 1, 0);
INSERT INTO A VALUES (2, 1, 0);
INSERT INTO A VALUES (3, 1, 1);

CREATE TABLE B (
  B_UNIQUE_ID int NOT NULL PRIMARY KEY,
  A_OTHER_ID int NOT NULL,
  XREF as 0 persisted,
  constraint FK_B_A FOREIGN KEY (A_OTHER_ID,XREF) references A (OTHER_XREF,UNIQ))

这有效:

  insert into B VALUES (2,1)

这打破了 FK 约束:

  insert into B VALUES (3,2)

表 A 中的两个计算列确保任何带有A_CURRENT_FL=1的行在OTHER_XREF. 其他行将NULL在该列中。然而,为了应用一个UNIQUE约束(外键的目标),我们需要一个对于带有 a 的每一行都明显不同的东西,同时对于带有=NULL的行来说是一个众所周知的值。在这种情况下,我制作了众所周知的 value 。A_CURRENT_FL10

最后,外键约束需要匹配这两个列,所以我们在表 B 中添加一个新的计算列,该列具有众所周知的值0

列名不是特别好,但我相信你能想出一些。


Note, also, that by the above, we've also implemented another constraint that you didn't mention, but that also may be important - there can't be two rows now in table A that both have A_CURRENT_FL set to 1, for the same A_OTHER_ID value. This also generates an error:

INSERT INTO A VALUES (4,1,1);
于 2012-09-07T07:46:46.213 回答