2015-12-14 3 views
-2

Я новичок в SQL Server. Я разрабатываю базу данных для проекта. Поэтому у меня есть старая база данных, и я создал новую и теперь я импортирую аргументы, которые сидят в старой базе данных, в новую. Но есть несколько таблиц, которые дают мне ошибку с нарушением. Как я могу это решить. Вот сценарии для таблиц, которые имеют значение:SQL SERVER, Msg 2627, Level 14, State 1, Line 4 Нарушение ограничения PRIMARY KEY

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 новости таблицы, я popultaing этого новой таблицы 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

Если вы прочитали ** все слова ** в сообщении об ошибке, это довольно ясно говорит о том, что проблема заключается в том, что вы пытаетесь вставить дублирующий ключ в столбец CodMunicipo в TabMunicipio, и что это нарушает ограничение первичного ключа. Насколько яснее можно сделать ** Вы пытаетесь вставить дублирующее значение в [это точное поле] в [этой точной таблице] ** be? –

+0

so Thanks Matt, я только хочу знать, что один из них установлен в 1.CodProvincia или CodMunicipio? Потому что я попытался вставить только один из них, и ошибка продолжается –

+0

у вас есть в определении 'CONSTRAINT PK_TabMunicipio_CodMunicipio PRIMARY KEY (CodMunicipio)' Это первичный ключ, поэтому «CodMunicipio» - это тот, у которого две записи в GestHandNet.dbo.TaBMUN.CodMunicipio, имеющие более 1 записи с CodMunicipio из 1. – xQbert

ответ

1

Сообщение об ошибке довольно ясно. Вы вставляете более одной строки в dbo.TabMunicipio с тем же значением первичного ключа. В частности, более чем одна строка, где CodMunicipio устанавливается в 1.

Там должно быть несколько строк в GestHandnet.dbo.TABMUN где CODMUN равен 1. Когда вы делаете INSERT, который пытается поместить несколько строк в dbo.TabMunicipio где CodMunicipio является 1, который вам «Не разрешено ограничение первичного ключа:

...CONSTRAINT PK_TabMunicipio_CodMunicipio PRIMARY KEY(CodMunicipio), 
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 для того, чтобы отобразить сообщение об ошибке, но по-прежнему и вставить уникальные строки.

Данные будут усечены, это еще одна ошибка, что было бы хорошо знать, какую строку (или столбец).

+0

Matt, Frisbee, Ken White, xQbert и Raj More, BIG Спасибо за объяснение –

+1

Вы должны проверьте ответ. У меня нет проблем, если вы ответите Мэтту. Но пусть люди знают, что на вопрос ответили. – Paparazzi

Смежные вопросы