私はSQLServerを使用しています。私は2つのテーブルを持っています、Animal
そしてCat
。データベースに新しい猫を追加するときに、両方のテーブルを更新したいと思います。Animal
最初に猫をテーブルに追加しanimal_Id
て、Cat
後でテーブルに追加できるようにする必要があります。
2つのテーブルに同時にレコードを追加する方法はありますか?ない場合、それを行うための最良の方法は何ですか?
アイデアが欲しいだけです。
私はSQLServerを使用しています。私は2つのテーブルを持っています、Animal
そしてCat
。データベースに新しい猫を追加するときに、両方のテーブルを更新したいと思います。Animal
最初に猫をテーブルに追加しanimal_Id
て、Cat
後でテーブルに追加できるようにする必要があります。
2つのテーブルに同時にレコードを追加する方法はありますか?ない場合、それを行うための最良の方法は何ですか?
アイデアが欲しいだけです。
トランザクションを使用する場合、両方の挿入は、少なくとも論理的には「同時に」実行されます。
つまり、トランザクションの外部から実行された他のクエリは、「挿入の間」のベースを見ることができません。また、両方の挿入の間に失敗があった場合(および有効なコミットがない場合)、最終状態は最初の挿入を無視します。
セッションに追加されたばかりの行のIDを取得するには、SCOPE_IDENTITYを使用します。
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
ない)、トランザクションが強制的にロールバックされることを保証します。
ここではトランザクションを使用することをお勧めします。例 (事前に新しい行の 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 を使用できます。
1つのテーブルへの挿入中にトリガーを使用するのはどうですか??