質問

これは、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

and

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の新しいエントリを指すようにすることも含まれます。これを達成する最も効率的な方法は何ですか?

役に立ちましたか?

解決

まず、 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());

他のヒント

SQL Server 2005以降を使用していて、1つの INSERT に多くのレコードを挿入している場合、 OUTPUT または OUTPUT INTO オプションこちらで、最初の挿入からのIDを使用します2番目に「再検索」する必要はありません。すべての IDENTITY 値を取得する行。

最初にプライマリテーブルに挿入します。

INSERT INTO trackstrings VALUES('myvalue')

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top