SQL INSERT
ステートメントは、個々の行をテーブルに挿入するために最も一般的に使用されます。
ただし、クエリの結果をテーブルに挿入することもできます。これは、一度に複数の行を挿入できることを意味します(クエリによって返される限り)。
基本的な例
これがデモンストレーションの基本的な例です。
INSERT INTO Pets2
SELECT * FROM Pets;
これにより、Pets
からすべての行が挿入されます テーブルをPets2
に テーブル。
Pets2
がすでに作成されていることを前提としています テーブルとそれが正しい定義を持っていること。
存在しない場合、または正しい定義がない場合は、エラーが発生します。
複数のテーブルからデータを挿入
このメソッドを使用して、複数のテーブルからデータを挿入できます。
INSERT INTO PetsTypesOwners
SELECT
p.PetId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
この例では、3つのテーブルのデータをPetsTypesOwners
という1つのテーブルに挿入しました。 。
各列を明示的にリストしたことに注意してください。これを行ったのは、宛先列の列が3つのテーブルの合計よりも少ないためです。この場合、すべての列を選択した場合、主キーと同じ名前と値を持つ外部キーが原因で、クエリが重複する列を返すためです。
これらの重複する列を含める場合は、宛先の列にこれらの重複する列を含める必要がありますが、重複するペアごとに名前が異なります。
すべての列を選択する例を次に示します(名前が表示されるように、ここで明示的に選択します):
INSERT INTO PetsTypesOwners2
SELECT
p.PetId,
p.OwnerId,
p.PetTypeId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
OwnerId
という2つの列があることがわかります。 2つはPetTypeId
と呼ばれます 、それぞれ異なるテーブルから。これらは、それぞれのテーブルの主キーと外部キーです。
これらの列が重複しているため、前の例ではそれぞれ1つだけを含めました。ただし、このデモの目的で、これらをこの例に含めました。
したがって、この新しいINSERT INTO... SELECT
に対応するため ステートメントでは、宛先テーブルに正しい列数があり、互換性のある定義が必要です。
したがって、宛先テーブルの定義は次のようになります。
CREATE TABLE PetsTypesOwners2 (
PetId int NOT NULL PRIMARY KEY,
PetPetType varchar(60) NOT NULL,
PetOwnerId int NOT NULL,
PetName varchar(60) NOT NULL,
DOB date NULL,
PetTypeId int NOT NULL,
PetType varchar(60) NOT NULL,
OwnerId int NOT NULL,
FirstName varchar(60) NOT NULL,
LastName varchar(60) NOT NULL,
Phone varchar(20) NOT NULL,
Email varchar(254)
);
この場合、重複する各列の1つにPet
のプレフィックスを付けました。 。具体的には、PetPetTypeId
を作成しました (これはp.OwnerId
にマップされます クエリの列)およびPetOwnerId
列(p.PetTypeId
にマップされます クエリの列)。
ただし、宛先テーブルの列を何と呼ぶかは問題ではないことに注意してください。 INSERT INTO... SELECT
ステートメントはそれを気にしません。 INSERT INTO... SELECT
ステートメントは列の順序にのみ関心があります。
ビューからデータを挿入
同じINSERT INTO... SELECT
を使用できます ビューからテーブルにデータを挿入するための構文。
簡単な例を次に示します。
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
この場合、vPetTypeCount
はビューであり、その内容をPetTypeCount
というテーブルに挿入しています。 。
ストアドプロシージャからデータを挿入
一部のDBMS(SQL Serverなど)も同じINSERT INTO... SELECT
を使用できます ストアドプロシージャからテーブルにデータを挿入するための構文。
簡単な例を次に示します。
INSERT INTO PetById
EXEC uspGetPetById 2;
繰り返しますが、これは正しい定義の宛先テーブルがあることを前提としています。
SELECT INTO
ステートメント
DBMSによっては、SELECT INTO
もあります 結果セットに基づいて新しいテーブルを自動的に作成し、その結果セットをそのテーブルに挿入するために使用できるステートメント。