3

私はSQLServerを使用しています。私は2つのテーブルを持っています、AnimalそしてCat。データベースに新しい猫を追加するときに、両方のテーブルを更新したいと思います。Animal最初に猫をテーブルに追加しanimal_Idて、Cat後でテーブルに追加できるようにする必要があります。

2つのテーブルに同時にレコードを追加する方法はありますか?ない場合、それを行うための最良の方法は何ですか?

アイデアが欲しいだけです。

4

5 に答える 5

3

トランザクションを使用する場合、両方の挿入は、少なくとも論理的には「同時に」実行されます。

つまり、トランザクションの外部から実行された他のクエリは、「挿入の間」のベースを見ることができません。また、両方の挿入の間に失敗があった場合(および有効なコミットがない場合)、最終状態は最初の挿入を無視します。

セッションに追加されたばかりの行のIDを取得するには、SCOPE_IDENTITYを使用します。

于 2012-08-28T14:05:00.110 に答える
3

1 つのステートメントで 2 つのテーブルに対して INSERT を使用することはできません。

SET XACT_ABORT ON
BEGIN TRANSACTION

INSERT INTO [A](...) VALUES(...);
INSERT INTO [B](...) VALUES(...);

COMMIT TRANSACTION
SET XACT_ABORT OFF

トランザクションは、それがすべてであるか、何もコミットされていないことを確認することです。XACT_ABORT は、エラーで失敗した場合 (したがって起動しCOMMIT TRANSACTIONない)、トランザクションが強制的にロールバックされることを保証します。

于 2012-08-28T14:06:23.290 に答える
0

ここではトランザクションを使用することをお勧めします。例 (事前に新しい行の ID を知っている場合):

DECLARE @CAT TABLE(id int, name varchar(50));
DECLARE @ANIMAL TABLE(id int);
DECLARE @anmalId INT = 1;

BEGIN TRAN 
 INSERT INTO @ANIMAL VALUES(@anmalId);
 INSERT INTO @CAT VALUES(@anmalId, 'Kitty');
COMMIT TRAN

SELECT * FROM @CAT;
SELECT * FROM @ANIMAL;

自動インクリメントの場合は @@identity を使用できます。

于 2012-08-28T14:14:17.417 に答える
-2

1つのテーブルへの挿入中にトリガーを使用するのはどうですか??

于 2012-08-28T14:11:14.560 に答える