W SQL Server, prosty INSERT zrobi:
create table dbo.Foo
(
ID int primary key identity,
ParentID int not null foreign key references foo(ID)
)
go
insert dbo.Foo (parentId) values (1)
select * from dbo.Foo
skutkuje
ID ParentID
----------- -----------
1 1
Jeśli próbujesz wstawić wartość, która będzie inna od swojej tożsamości nasion, wstawienie zawiedzie.
UPDATE:
Pytanie nie jest zbyt jasne, na co kontekst jest (czyli to kod powinien działać w żywych systemu produkcyjnego lub po prostu skrypt instalacyjny DB) oraz z uwag wydaje się trudne kodowania identyfikator może nie być opcją. Chociaż powyższy kod powinien normalnie działać poprawnie w skryptach inicjalizujących bazy danych, w których hierarchiczny identyfikator główny może być znany i stały, w przypadku lasu (kilka katalogów z identyfikatorami nieznanymi wcześniej) następujące czynności powinny działać zgodnie z przeznaczeniem:
create table dbo.Foo
(
ID int primary key identity,
ParentID int not null foreign key references foo(ID)
)
go
insert dbo.Foo (parentId) values (IDENT_CURRENT('dbo.Foo'))
Następnie można było zapytać o ostatnią tożsamość jak zwykle (SCOPE_IDENTITY
itd.). Obaw adres @ usr jest, kod jest w rzeczywistości transakcyjnie bezpieczne, jak w poniższym przykładzie pokazuje:
insert dbo.Foo (parentId) values (IDENT_CURRENT('dbo.Foo'))
insert dbo.Foo (parentId) values (IDENT_CURRENT('dbo.Foo'))
insert dbo.Foo (parentId) values (IDENT_CURRENT('dbo.Foo'))
select * from dbo.Foo
select IDENT_CURRENT('dbo.Foo')
begin transaction
insert dbo.Foo (parentId) values (IDENT_CURRENT('dbo.Foo'))
rollback
select IDENT_CURRENT('dbo.Foo')
insert dbo.Foo (parentId) values (IDENT_CURRENT('dbo.Foo'))
select * from dbo.Foo
Rezultat:
ID ParentID
----------- -----------
1 1
2 2
3 3
currentIdentity
---------------------------------------
3
currentIdentity
---------------------------------------
4
ID ParentID
----------- -----------
1 1
2 2
3 3
5 5
Pytanie interstingowe. Czy możliwe jest nawet odniesienie do siebie? Jak możesz utworzyć 1 rekord, jeśli jest on nowy? – YvesR
Który wiersz jest rodzicem pierwszego rzędu? –
Dla pierwszego wiersza ParentID powinien być identyfikatorem. Jeśli chcę użyć wielu korzeni w strukturze drzewa, to każdy root ma ParentID == ID. Dlatego pytanie może zostać rozszerzone jako - jak mogę wstawić wiersze główne?Czy procedura składowana może użyć SCOPE_IDENTITY, aby wstawić tę wstawkę? – Nezreli