0
CREATE TABLE tImprumuturi
  (
     ID_Imprumut  INT IDENTITY PRIMARY KEY,
     DataImprumut DATE DEFAULT getdate(),
     DataScadenta AS ( dateadd(day, 2, DataImprumut) ) persisted,
     CodCD        CHAR(10) FOREIGN KEY REFERENCES tCD(CodCd)NOT NULL,
     CodCV        CHAR(10) FOREIGN KEY REFERENCES tCaseteVideo(CodCaseta),
     CodAb        CHAR(10) FOREIGN KEY REFERENCES tAbonati(CodAbonat) NOT NULL,
     CONSTRAINT ucCodes UNIQUE (CodCD, CodCV, CodAb)
  ) 

我不想拥有许多相同的 CodCD OR CodCV OR CodAb,但绝不希望有两个具有相同 CodCD AND CodCV AND CodAb 的记录。如您所见,我的代码在顶部,即使我有指令CONSTRAINT ucCodes UNIQUE (CodCD,CodCV,CodAb),它仍然允许我插入两个或更多具有相同CodCDandCodCV和的记录CodAb。下面你可以看到我的记录

insert into tImprumuturi(CodCV,CodCD,CodAb)
values('CV21','CD20','ab9'),
      ('CV21','CD19','ab9')
4

2 回答 2

3
CONSTRAINT ucCodes UNIQUE (CodCD, CodCV, CodAb) 

以上对这三个值设置了唯一约束,就好像它们是一个值一样。

这意味着以下将起作用:

set values('a', 'b', 'c'),
          ('a', 'b', 'd')

以下将失败:

set values('a', 'b', 'c'),
          ('a', 'b', 'c')

编辑

针对您的评论,您可以执行以下操作:

CONSTRAINT ucCodCD UNIQUE (CodCD, CodCV) 
CONSTRAINT ucCodCV UNIQUE (CodCD, CodAb) 
CONSTRAINT ucCodAb UNIQUE (CodCV, CodAb)

这意味着以下将起作用:

set values('a', 'b', 'c'),
          ('a', 'd', 'e')

以下将失败:

set values('a', 'b', 'c'),
          ('a', 'b', 'd')
于 2013-09-04T18:09:09.213 回答
2

它的工作方式与您在表中定义的完全一样。由于您对 CodCV、CodCD、CodAb 的组合创建了约束,所以这里 ('CV21','CD20','ab9') 和 ('CV21','CD19','ab9') 将被视为唯一。 (CodCD 的值不同)。可能您应该尝试创建 2 个单独的唯一约束,如下所示:

CONSTRAINT ucCod_CD UNIQUE (CodCD) 
CONSTRAINT ucCod_CV UNIQUE (CodCV) 
CONSTRAINT ucCod_Ab UNIQUE (CodAb)
于 2013-09-04T18:09:34.793 回答