在我看来,这是一个随着SQL /数据库开发而不断出现的问题,但后来我对这一切都不熟悉,所以请原谅我的无知。
我有两张桌子:
CREATE TABLE [dbo].[Tracks](
[TrackStringId] [bigint] NOT NULL,
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Time] [datetime] NOT NULL,
CONSTRAINT [PK_Tracks] PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Tracks] CHECK CONSTRAINT [FK_Tracks_AudioStreams]
GO
ALTER TABLE [dbo].[Tracks] WITH CHECK ADD CONSTRAINT
[FK_Tracks_TrackStrings] FOREIGN KEY([TrackStringId])
REFERENCES [dbo].[TrackStrings] ([Id])
GO
ALTER TABLE [dbo].[Tracks] CHECK CONSTRAINT [FK_Tracks_TrackStrings]
GO
和
CREATE TABLE [dbo].[TrackStrings](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[String] [nvarchar](512) NOT NULL,
CONSTRAINT [PK_Strings] PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我想在track表中插入一个新条目。这还将涉及在tracktrings表中插入一个新条目,并确保轨道中的外键列tracktringid指向tracktrings中的新条目。实现这一目标的最有效方法是什么?
答案 0 :(得分:11)
首先,插入TrackStrings
,省略列列表中的主键列。这将调用其IDENTITY
列,该列会自动生成值。
INSERT INTO [dbo].[TrackStrings] ([String])
VALUES ('some string');
其次,插入Tracks
并将TrackStringId
指定为IDENTITY
函数,该函数返回当前INSERT INTO [dbo].[Tracks] ([TrackStringId], [Time])
VALUES (SCOPE_IDENTITY(), CURRENT_TIMESTAMP());
列生成的最新值范围
{{1}}
答案 1 :(得分:7)
如果您使用的是SQL Server 2005或更高版本并且在单个INSERT
中插入了大量记录,则可以查看OUTPUT
或OUTPUT INTO
个选项here使用第二个插入中的标识,而无需“重新查找”行以获取所有IDENTITY
值。
答案 2 :(得分:0)
首先插入主表。
INSERT INTO trackstrings VALUES('myvalue')
接下来获取身份。此方法取决于您是在1语句还是存储过程或其他方法中完成所有操作。我将假设1个语句,因此我将插入标识特殊变量。
INSERT INTO tracks VALUES( @@IDENTITY, getdate() )
这样的事情应该根据你的具体情况来做。关键是@@ IDENTITY变量。它包含您正在使用的连接的最后插入标识值。它不是特定于表的,它只是在连接生命周期中插入的最新标识。