Trong SQL Server, một INSERT đơn giản sẽ làm:
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
kết quả trong
ID ParentID
----------- -----------
1 1
Nếu bạn đang cố gắng để chèn một giá trị đó sẽ khác nhau từ hạt giống nhận dạng của bạn, chèn sẽ thất bại.
UPDATE:
Câu hỏi đặt ra không phải là quá rõ ràng về những gì bối cảnh là (tức là mã vụ phải làm việc trong một hệ thống sản xuất trực tiếp hoặc chỉ là một thiết lập kịch bản DB) và từ các ý kiến có vẻ như cứng mã hóa ID có thể không phải là một tùy chọn. Mặc dù mã ở trên thường hoạt động tốt trong các tập lệnh khởi tạo DB trong đó ID gốc phân cấp cần phải được biết và không đổi, trong trường hợp rừng (một số gốc có ID không được biết trước), các mã sau sẽ hoạt động như dự định:
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'))
Sau đó, người dùng có thể truy vấn danh tính cuối cùng như thường lệ (SCOPE_IDENTITY
, v.v.). Để mối quan tâm địa chỉ @ usr của, mã này là trong thực tế transactionally an toàn như ví dụ dưới đây trình bày:
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
Kết quả:
ID ParentID
----------- -----------
1 1
2 2
3 3
currentIdentity
---------------------------------------
3
currentIdentity
---------------------------------------
4
ID ParentID
----------- -----------
1 1
2 2
3 3
5 5
Nguồn
2012-11-10 09:17:53
Câu hỏi xen kẽ. Thậm chí bạn có thể tham khảo chính mình không? Làm thế nào bạn có thể tạo ra 1 bản ghi nếu nó mới được tạo ra? – YvesR
Hàng nào là phụ huynh của hàng đầu tiên của bạn? –
Đối với dòng đầu tiên ParentID phải là ID. Nếu tôi muốn sử dụng nhiều rễ trong cấu trúc cây của tôi thì bất kỳ gốc nào có ParentID == ID. Do đó, câu hỏi có thể được mở rộng như - làm thế nào tôi có thể chèn các hàng gốc?Quy trình được lưu trữ có thể sử dụng SCOPE_IDENTITY để thực hiện việc chèn này không? – Nezreli