SQL Server SELECT INTO で既存のテーブルにデータを追加する方法
SQL Server の SELECT INTO で既存のテーブルにデータを追加する方法
SQL Server の SELECT INTO
は、SELECT ステートメントで取得したデータを既存のテーブルに挿入する便利な機能です。既存のデータを更新したり、別のテーブルからデータをコピーしたり、複雑な処理の結果を新しいレコードとして追加したりと、様々な用途に活用できます。
基本構文
INSERT INTO 既存テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM データソース;
ポイント
- 既存テーブル名: データを挿入するテーブルを指定します。
- 列名: 挿入するデータの列を指定します。既存テーブルの列名と一致する必要があります。
- データソース: SELECT ステートメントでデータを取得する元となるテーブル、ビュー、サブクエリなどを指定します。
- 列名とデータソースの列数は一致する必要があります。
- データ型も一致する必要があります。一致しない場合は、暗黙的な変換が行われる場合もありますが、エラーが発生する可能性もあります。
例
別のテーブルからデータをコピー
INSERT INTO 顧客情報 (顧客名, 住所, 電話番号)
SELECT 名前, 〒, 電話
FROM 顧客リスト;
複雑な処理の結果を新しいレコードとして追加
INSERT INTO 注文履歴 (注文日, 商品名, 数量, 金額)
SELECT GETDATE(), 商品名, 在庫数, 単価 * 在庫数
FROM 商品在庫
WHERE 在庫数 > 0;
INSERT INTO と SELECT ステートメントの組み合わせ
SELECT INTO
は、INSERT INTO
と SELECT
ステートメントを組み合わせた短縮形です。
SELECT 列名1, 列名2, ...
INTO 既存テーブル名
FROM データソース;
主キーの考慮
既存テーブルに主キーがある場合、SELECT INTO
で挿入するデータは主キーの制約を満たす必要があります。重複する主キーを挿入しようとすると、エラーが発生します。
その他の注意点
- 既存テーブルにデータが存在する場合は、
INSERT INTO
で挿入するデータは末尾に追加されます。 SELECT INTO
は、トランザクションの一部として実行されます。そのため、エラーが発生した場合は、ロールバックによって挿入されたデータは取り消されます。
補足
SELECT INTO
は、新しいテーブルを作成するよりも高速にデータを追加できます。SELECT INTO
は、複雑な処理の結果を新しいレコードとして追加する際に便利です。
別のテーブルからデータをコピー
-- 顧客情報テーブルと顧客リストテーブルを作成
CREATE TABLE 顧客情報 (
顧客ID INT PRIMARY KEY IDENTITY,
顧客名 VARCHAR(50) NOT NULL,
住所 VARCHAR(100) NOT NULL,
電話番号 VARCHAR(20) NOT NULL
);
CREATE TABLE 顧客リスト (
名前 VARCHAR(50) NOT NULL,
〒 VARCHAR(10) NOT NULL,
電話 VARCHAR(20) NOT NULL
);
-- 顧客リストテーブルのデータを顧客情報テーブルにコピー
INSERT INTO 顧客情報 (顧客名, 住所, 電話番号)
SELECT 名前, 〒, 電話
FROM 顧客リスト;
-- 顧客情報テーブルの内容を確認
SELECT * FROM 顧客情報;
複雑な処理の結果を新しいレコードとして追加
-- 商品在庫テーブルを作成
CREATE TABLE 商品在庫 (
商品ID INT PRIMARY KEY,
商品名 VARCHAR(50) NOT NULL,
在庫数 INT NOT NULL,
単価 DECIMAL(10, 2) NOT NULL
);
-- 注文履歴テーブルを作成
CREATE TABLE 注文履歴 (
注文ID INT PRIMARY KEY IDENTITY,
注文日 DATETIME NOT NULL,
商品名 VARCHAR(50) NOT NULL,
数量 INT NOT NULL,
金額 DECIMAL(10, 2) NOT NULL
);
-- 在庫数>0の商品を注文履歴テーブルに追加
INSERT INTO 注文履歴 (注文日, 商品名, 数量, 金額)
SELECT GETDATE(), 商品名, 在庫数, 単価 * 在庫数
FROM 商品在庫
WHERE 在庫数 > 0;
-- 注文履歴テーブルの内容を確認
SELECT * FROM 注文履歴;
INSERT INTO と SELECT ステートメントの組み合わせ
-- 顧客情報テーブルを作成
CREATE TABLE 顧客情報 (
顧客ID INT PRIMARY KEY IDENTITY,
顧客名 VARCHAR(50) NOT NULL,
住所 VARCHAR(100) NOT NULL,
電話番号 VARCHAR(20) NOT NULL
);
-- 顧客リストテーブルのデータを顧客情報テーブルにコピー
SELECT *
INTO 顧客情報
FROM 顧客リスト;
-- 顧客情報テーブルの内容を確認
SELECT * FROM 顧客情報;
SQL Server で既存のテーブルにデータを追加する他の方法
INSERT INTO
ステートメントは、データを1行ずつ挿入する最も基本的な方法です。
INSERT INTO 既存テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...);
INSERT INTO 顧客情報 (顧客名, 住所, 電話番号)
VALUES ('山田太郎', '〒100-0001 東京都千代田区', '03-1234-5678');
BULK INSERT
は、CSVファイルなどの外部データソースから大量のデータを高速に挿入するのに適しています。
BULK INSERT 既存テーブル名
FROM 'データファイルパス'
WITH (FORMAT = 'CSV', FIELDTERMINATOR = ',');
BULK INSERT 顧客情報
FROM 'C:\data\顧客情報.csv'
WITH (FORMAT = 'CSV', FIELDTERMINATOR = ',');
OPENROWSET
は、別のデータベースサーバーにあるテーブルのデータを挿入するのに使用できます。
INSERT INTO 既存テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM OPENROWSET('接続文字列', 'SELECT * FROM
sql sql-server t-sql