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テーブルに新しいエントリを挿入し、tracksの外部キー列trackstringidがtrackstringsの新しいエントリを指していることを確認することも含まれます。これを達成するための最も効率的な手段は何ですか?

4

3 に答える 3

12

TrackStrings最初に、列リストから主キー列を省略して挿入します。IDENTITYこれにより、値を自動的に生成する列が呼び出されます。

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

次に、挿入してその関数Tracksとして指定します。これは、現在のスコープ内の列によって生成された最新の値を返します。TrackStringIdSCOPE_IDENTITY()IDENTITY

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

SQL Server 2005 以降を使用していて、単一の に多数のレコードを挿入している場合は、ここINSERTを調べるOUTPUTか、OUTPUT INTOオプションを選択して、取得する行を「再検索」することなく、最初の挿入からの ID を 2 番目に使用できます。すべての値。IDENTITY

于 2008-11-27T04:56:43.837 に答える
0

最初に主テーブルに挿入します。

INSERT INTO trackstrings VALUES('myvalue')

次にIDを取得します。この方法は、すべてを 1 つのステートメントで行うか、ストアド プロシージャまたはその他の方法で行うかによって異なります。1 つのステートメントを想定しているので、identity 特殊変数を挿入するだけです。

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

正確なシナリオに応じて、そのようなことを行う必要があります。キーは @@IDENTITY 変数です。使用している接続に対して最後に挿入された ID 値を保持します。これはテーブル固有のものではなく、単に接続の有効期間中に挿入された最新の ID です。

于 2008-11-27T00:32:10.113 に答える