2013-12-12 6 views
1

DDL:Msg 2627, произошло во время использования IDENT_CURRENT()

CREATE TABLE OSOBA 
(
    id INT PRIMARY KEY not null IDENTITY, 
    imie VARCHAR(30) not null, 
    nazwisko VARCHAR(40) not null, 
    zawod VARCHAR(30) not null, 
    dataUrodzenia DATE, 
    plec BIT not null, 
    narodowosc VARCHAR(30) not null, 
); 

CREATE TABLE OSOBISTOSCI 
(
    nazwaMiasta VARCHAR(30) not null, 
    id INT not null, 
    adres VARCHAR(50), 
    czy BIT, 
    PRIMARY KEY (id), 
    FOREIGN KEY (id) REFERENCES OSOBA, 
    FOREIGN KEY (nazwaMiasta) REFERENCES MIASTA, 
); 

CREATE TABLE ARCHITEKCI 
(
    id INT not null, 
    uprawnienia VARCHAR(30) UNIQUE, 
    styl VARCHAR(30) not null, 
    liczba INT not null, 
    PRIMARY KEY (id), 
    FOREIGN KEY (id) REFERENCES OSOBA, 
); 

И у меня есть эти инструкции вставки:

-- these work fine 
INSERT INTO OSOBA (imie,nazwisko,zawod,dataUrodzenia,plec,narodowosc) VALUES ('Lech', 'Wałęsa', 'Elektryk', '19430129', 1, 'Polak'); 
INSERT INTO OSOBISTOSCI (nazwaMiasta, id, adres, czy) VALUES ('Gdańsk', IDENT_CURRENT('OSOBA'), 'ul. Polanki', 0); 

-- these throw the below error message 
INSERT INTO OSOBA (imie,nazwisko,zawod,dataUrodzenia,plec,narodowosc) VALUES ('Marcia','Frank','Architekt','19570720','0','Niemiec'); 
INSERT INTO ARCHITEKCI (id,styl,liczba) VALUES (IDENT_CURRENT('OSOBA'),'Nowoczesny',8); 

Ошибка:

Msg 2627, Level 14, State 1, Line 124
Violation of UNIQUE KEY constraint 'UQ_ARCHITEK_982D973E2BA18BE7'. Cannot insert duplicate key in object 'dbo.ARCHITEKCI'. The duplicate key value is().

+1

Что означает «неработало»? Вы получили сообщение об ошибке? Если да, то какой был текст (мы не склонны запоминать номера ошибок, например 2627). Кроме того, почему вы вообще используете IDENT_CURRENT? Это небезопасно для параллелизма - идентификатор IDENT_CURRENT, который вы читаете, меня получает дополнительный пользователь, находящийся между этими двумя вставками. Вы должны использовать SCOPE_IDENTITY() или, еще лучше, предложение OUTPUT. –

+0

Благодарим за сообщение об ошибке - предоставленный DDL выдает сообщение об ошибке из-за отсутствующей таблицы 'MIASTA'. Укажите это определение таблицы или удалите внешний ключ из примера. – Bryan

ответ

2

Как Аарон упомянул IDENT_CURRENT является не очень надежный. Было бы лучше использовать предложение OUTPUT. См. Следующий пример:

DECLARE @LatestID TABLE (ID INT); 
INSERT INTO #OSOBA (imie,nazwisko,zawod,dataUrodzenia,plec,narodowosc) 
OUTPUT INSERTED.ID INTO @LatestID 
VALUES ('Marcia','Frank','Architekt','19570720','0','Niemiec'); 

INSERT INTO #ARCHITEKCI (id,styl,liczba) VALUES ((SELECT ID FROM @LatestID),'Nowoczesny',8); 
Смежные вопросы