SQL SERVER,消息2627,级别14,状态1,行4违反PRIMARY KEY约束

时间:2015-12-14 19:52:16

标签: sql-server database sql-server-2008 tsql

我是SQL Server的新手。我正在为一个项目开发一个数据库,所以我有一个旧数据库,我创建了一个新数据库,现在我将旧数据库中的参数导入到新数据库中。但是有一些表给了我违规密钥错误。我怎么能解决这个问题。以下是重要表格的脚本:

Create Table TabProv
(

CodProvincia int,
DescrProvv Char (35),
DataHorC datetime,
DataHorA datetime,
CodOp1 varchar (6),
CodOp2 varchar(6),
CONSTRAINT PK_TabProv_CodProv PRIMARY KEY(CodProvincia)

);

Create Table TabMunicipio
(
CodProvincia int,
CodMunicipio int,
DescMun char(35) ,
DataHorC datetime,
DataHorA datetime,
CodOp1 varchar (6),
CodOp2 varchar(6),

CONSTRAINT PK_TabMunicipio_CodMunicipio PRIMARY KEY(CodMunicipio),
CONSTRAINT FK_TabMunicipio_TabProv FOREIGN KEY(CodProvincia) REFERENCES TabProv(CodProvincia)

);

Create Table TabLoca
(
    CodProvincia int,
    CodMunicipio int,
    CodLoc int,
    DescLoc char(35) ,
    DataHorC datetime,
    DataHorA datetime,
    CodOp1 varchar (6),
    CodOp2 varchar(6),

    CONSTRAINT PK_TabLoca_CodLoc PRIMARY KEY(CodLoc),
    CONSTRAINT FK_TabLoca_TabMunicipio FOREIGN KEY(CodMunicipio) REFERENCES TabMunicipio (CodMunicipio),
    CONSTRAINT FK_TabLoca_Prov FOREIGN KEY(CodProvincia) REFERENCES TabProv (CodProvincia)


);

所以在创建了这3个新闻表之后,我正在使用这个新表dbo,使用位于旧数据库表的值,表Municipio就像魅力一样,但表Prov给了我这个错误:

DELETE FROM GESTHANDNET2015v1.dbo.TabMunicipio; 

INSERT INTO GESTHANDNET2015v1.dbo.TabMunicipio([CodMunicipio],[DescMun],[CodOp1],[CodOp2],[DataHorA]) 
SELECT T2.[CODMUN],[DESMUN],[CODOP],[CODOP2],[DATMOD] FROM
GestHandnet.dbo.TABMUN T2;

(0 row(s) affected) 
Msg 2627, Level 14, State 1, Line 4 

Violation of PRIMARY KEY constraint 'PK_TabMunicipio_CodMunicipio'. 
Cannot insert duplicate key in object 'dbo.TabMunicipio'. 
The duplicate key value is (1). The statement has been terminated.

请问我做错了什么。

2 个答案:

答案 0 :(得分:1)

错误信息非常清楚。您正在使用相同的主键值向dbo.TabMunicipio插入多行。具体而言,CodMunicipio设置为1的多行。

GestHandnet.dbo.TABMUN中必须有多行CODMUN为1.当您执行INSERT时,会尝试将多行放入dbo.TabMunicipio,其中CodMunicipio为1,这是您的不允许使用主键约束:

...CONSTRAINT PK_TabMunicipio_CodMunicipio PRIMARY KEY(CodMunicipio),

答案 1 :(得分:1)

CodProvincia不是问题。它没有唯一的约束。 FOREIGN KEY不是一个独特的约束。问题是CodMunicipio。

很多人想知道哪一个(1)。遗憾的是,SQL不会向您提供该信息。如果您无法直接检查数据,则您的选项是镜像表,没有唯一约束来查找重复项。

如果您的插入非常简单

SELECT T2.[CODMUN], [DESMUN],[CODOP], [CODOP2], [DATMOD] 
  FROM GestHandnet.dbo.TABMUN T2 
 WHERE T2.[CODMUN] = 1;

您可以使用IGNORE_DUP_KEY = ON显示错误,但继续并插入唯一的行。

数据被截断是另一个错误,知道哪一行(或列)会很好。