我是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.
请问我做错了什么。
答案 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显示错误,但继续并插入唯一的行。
数据被截断是另一个错误,知道哪一行(或列)会很好。