如何在SQLServer2008(R2)中的更多列上添加唯一约束?

如何在SQLServer2008(R2)中的更多列上添加唯一约束?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我不想有很多相同的CodCD、CodCV或CodAb,但决不希望有两个记录具有相同的CodCD、CodCV和CodAb。正如您所看到的,我的代码位于顶部,即使我有指令约束ucCodes UNIQUE(CodCD,CodCV,CodAb),它仍然允许我插入两个或多个具有相同CodCD和CodAb的记录。下面你可以看到我的记录 CREATE TABLE tImprumuturi ( ID_Imprumut INT IDENTITY PRIMARY KEY, DataImpr

我不想有很多相同的CodCD、CodCV或CodAb,但决不希望有两个记录具有相同的CodCD、CodCV和CodAb。正如您所看到的,我的代码位于顶部,即使我有指令
约束ucCodes UNIQUE(CodCD,CodCV,CodAb)
,它仍然允许我插入两个或多个具有相同
CodCD
CodAb
的记录。下面你可以看到我的记录

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)
  ) 
上面对这三个值设置了唯一的约束,就像它们是一个值一样

这意味着以下措施将起作用:

CONSTRAINT ucCodes UNIQUE (CodCD, CodCV, CodAb) 
CONSTRAINT ucCodCD UNIQUE (CodCD, CodCV) 
CONSTRAINT ucCodCV UNIQUE (CodCD, CodAb) 
CONSTRAINT ucCodAb UNIQUE (CodCV, CodAb)
而以下措施将失败:

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

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

set values('a', 'b', 'c'),
          ('a', 'b', 'c')
set values('a', 'b', 'c'),
          ('a', 'b', 'd')
这意味着以下措施将起作用:

CONSTRAINT ucCodes UNIQUE (CodCD, CodCV, CodAb) 
CONSTRAINT ucCodCD UNIQUE (CodCD, CodCV) 
CONSTRAINT ucCodCV UNIQUE (CodCD, CodAb) 
CONSTRAINT ucCodAb UNIQUE (CodCV, CodAb)
而以下措施将失败:

set values('a', 'b', 'c'),
          ('a', 'b', 'd')
set values('a', 'b', 'c'),
          ('a', 'd', 'e')
上面对这三个值设置了唯一的约束,就像它们是一个值一样

这意味着以下措施将起作用:

CONSTRAINT ucCodes UNIQUE (CodCD, CodCV, CodAb) 
CONSTRAINT ucCodCD UNIQUE (CodCD, CodCV) 
CONSTRAINT ucCodCV UNIQUE (CodCD, CodAb) 
CONSTRAINT ucCodAb UNIQUE (CodCV, CodAb)
而以下措施将失败:

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

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

set values('a', 'b', 'c'),
          ('a', 'b', 'c')
set values('a', 'b', 'c'),
          ('a', 'b', 'd')
这意味着以下措施将起作用:

CONSTRAINT ucCodes UNIQUE (CodCD, CodCV, CodAb) 
CONSTRAINT ucCodCD UNIQUE (CodCD, CodCV) 
CONSTRAINT ucCodCV UNIQUE (CodCD, CodAb) 
CONSTRAINT ucCodAb UNIQUE (CodCV, CodAb)
而以下措施将失败:

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

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

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

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

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

您向我们显示的行具有不同的
CodCD
值,因此它们不相同。虽然您的问题不清楚,但基于这一行,我不希望有许多相同的CodCD、CodCV或CodAb,似乎您只需要3个唯一的约束,每列一个。@Martin Smith:在我的记录中有一个双引号:“CV21”和“ab9”。所以你想
CodCV
是唯一的,
CodCD
是唯一的,
CodAb
是唯一的?如果是这样,您需要为每行设置三个约束,您向我们显示的行具有不同的
CodCD
值,因此它们不相同。虽然您的问题不清楚,但基于这一行,我不希望有许多相同的CodCD、CodCV或CodAb,似乎您只需要3个唯一的约束,每列一个。@Martin Smith:在我的记录中有一个双引号:“CV21”和“ab9”。所以你想
CodCV
是唯一的,
CodCD
是唯一的,
CodAb
是唯一的?如果是这样的话,您需要为每个列设置三个约束,那么似乎您根本不需要复合列上的唯一约束。请确认您的要求,然后如果需要,为3列创建3个单独的约束。我已经编辑了我的代码,现在您希望能够插入重复的值。似乎您根本不需要复合列上的唯一约束。请确认您的要求,然后如果需要,为3列创建3个单独的约束。我已经编辑了我的代码,现在您希望能够在所有位置插入重复值。如果我插入值('CV21'、'CD20'*、'ab9'),我不想再次插入值('CV1'、'CD20'、'ab9')或任何涉及重复值的其他组合​​这正是我想要的!非常感谢你!爱你!:)如果我插入值('CV21'、'CD20'*、'ab9'),我不想再次插入值('CV1'、'CD20'、'ab9')或涉及重复值的任何其他组合​​这正是我想要的!非常感谢你!爱你!:)