如果我有一个表格
Table
{
ID int primary key identity,
ParentID int not null foreign key references Table(ID)
}
如何向表格中插入第一行?
从业务逻辑角度看,不应该删除ParentID的非空约束。
Table
{
ID int primary key identity,
ParentID int not null foreign key references Table(ID)
}
如何向表格中插入第一行?
从业务逻辑角度看,不应该删除ParentID的非空约束。
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
ID ParentID
----------- -----------
1 1
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'))
然后,像往常一样查询最后的标识符(SCOPE_IDENTITY
等)。为了解决@usr的顾虑,事实上以下示例证明该代码在事务安全方面是可靠的:
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
结果:
ID ParentID
----------- -----------
1 1
2 2
3 3
currentIdentity
---------------------------------------
3
currentIdentity
---------------------------------------
4
ID ParentID
----------- -----------
1 1
2 2
3 3
5 5
NOT NULL
约束。它没有父节点,因此假设 ParentID
为 NOT NULL
从一开始就是错误的。 ParentID
上添加索引以验证只有一个具有值 NULL
:create unique nonclustered index ... on T (ParentID) where (ParentID IS NULL)
IF (SELECT COUNT(*) FROM T WHERE ParentID IS NULL) > 1 RAISEERROR
。 - usrCREATE TABLE MyTable
(
ID int PRIMARY KEY IDENTITY(1, 1),
ParentID int NOT NULL,
CONSTRAINT MyTable_ID FOREIGN KEY (ParentID) REFERENCES MyTable(ID)
);
SET IDENTITY_INSERT MyTable ON;
INSERT INTO MyTable (ID, ParentID)
VALUES (1, 1);
SET IDENTITY_INSERT MyTable OFF;
WHILE @@IDENTITY <= 5
BEGIN
INSERT INTO MyTable (ParentID)
VALUES (@@IDENTITY);
END;
SELECT *
FROM MyTable;
IF OBJECT_ID('MyTable') IS NOT NULL
DROP TABLE MyTable;