10

在我看来,这似乎是 SQL/数据库开发中一直出现的问题,但是我对这一切都是新手,所以请原谅我的无知。

我有 2 张桌子:

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]

我想在轨道表中插入一个新条目。这还将涉及在 trackstrings 表中插入一个新条目,并确保 track 中的外键列 trackstringid 指向 trackstrings 中的新条目。实现这一目标的最有效方法是什么?

4

3 回答 3

12

首先,插入到TrackStrings,从列列表中省略主键列。这会调用其IDENTITY自动生成值的列。

INSERT INTO [dbo].[TrackStrings] ([String]) 
  VALUES ('some string');

其次,插入Tracks并指定它TrackStringId的函数,它返回由当前范围内的列SCOPE_IDENTITY()生成的最新值。IDENTITY

INSERT INTO [dbo].[Tracks] ([TrackStringId], [Time]) 
  VALUES (SCOPE_IDENTITY(), CURRENT_TIMESTAMP());
于 2008-11-27T00:28:24.317 回答
7

如果您使用的是 SQL Server 2005 或更高版本,并且在单个中插入大量记录INSERT,则可以查看OUTPUTOUTPUT INTO选择此处以在第二个中使用第一个插入的标识,而无需“重新查找”要获取的行所有的IDENTITY价值观。

于 2008-11-27T04:56:43.837 回答
0

首先插入到主表中。

INSERT INTO trackstrings VALUES('myvalue')

接下来获取身份。此方法取决于您是在 1 个语句或存储过程或其他方法中完成所有操作。我将假设 1 条语句,所以我将插入标识特殊变量。

INSERT INTO tracks VALUES( @@IDENTITY, getdate() )

类似的事情应该根据你的具体情况来做。关键是@@IDENTITY 变量。它保存您正在使用的连接的最后插入的标识值。它不是特定于表的,它只是在连接生命周期内插入的最新身份。

于 2008-11-27T00:32:10.113 回答