テーブルに行を挿入します。AnalyticDB for MySQL では、INSERT INTO は INSERT IGNORE INTO のように動作します。挿入する行のプライマリキーが既存の行と重複する場合、競合する行は上書きされずに暗黙的に無視されます。
構文
INSERT [IGNORE]
INTO table_name
[( column_name [, ...] )]
[VALUES]
[(value_list[, ...])]
[query];
パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
IGNORE |
いいえ | プライマリキーが既存の行と重複する行をスキップします。 |
column_name |
いいえ | ターゲット列の名前。 |
query |
— | 結果がテーブルに挿入される SELECT 文。 |
注意事項
列名を省略した場合、VALUES リストの値は、CREATE TABLE 文で定義された列と同じ順序で指定する必要があります。
例
以下の例では、次に示すように定義された customer と courses の 2 つのテーブルを使用します。
CREATE TABLE customer (
customer_id bigint NOT NULL COMMENT '顧客 ID',
customer_name varchar NOT NULL COMMENT '顧客名',
phone_num bigint NOT NULL COMMENT '電話番号',
city_name varchar NOT NULL COMMENT '都市',
sex int NOT NULL COMMENT '性別',
id_number varchar NOT NULL COMMENT 'ID カード番号',
home_address varchar NOT NULL COMMENT '自宅住所',
office_address varchar NOT NULL COMMENT '勤務先住所',
age int NOT NULL COMMENT '年齢',
login_time timestamp NOT NULL COMMENT 'ログイン時刻',
PRIMARY KEY (login_time, customer_id, phone_num)
)
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT '顧客情報テーブル';CREATE TABLE courses (
id bigint AUTO_INCREMENT PRIMARY KEY,
name varchar(20) NOT NULL,
grade varchar(20) DEFAULT 'Grade 3',
submission_date timestamp
)
DISTRIBUTED BY HASH(id);
列名を明示的に指定して単一行を挿入する
各列名を指定することで、テーブル定義とは無関係な順序で挿入できます。
INSERT INTO customer (customer_id, customer_name, phone_num, city_name, sex, id_number, home_address, office_address, age, login_time)
VALUES
(002367, 'Alan', '13900001234', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 23, '2018-03-02 10:00:00');
列名を指定せずに単一行を挿入する
値の順序が CREATE TABLE の定義と完全に一致する場合は、列名を省略できます。
INSERT INTO customer
VALUES
(002367, 'Alan', '13900001234', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 23, '2018-03-02 10:00:00');
複数行を挿入する
複数行を 1 つの文にまとめることで、ラウンドトリップを削減できます。
INSERT INTO customer (customer_id, customer_name, phone_num, city_name, sex, id_number, home_address, office_address, age, login_time)
VALUES
(002367, 'Tom', '13900001234', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 23, '2018-03-02 10:00:00'),
(002368, 'Alex', '13900001111', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 28, '2018-08-01 11:00:00'),
(002369, 'Eric', '13900002222', 'Hangzhou', 1, '987300', 'West Lake', 'Cloud Town', 35, '2018-09-12 08:11:00');
列名を指定せずに複数行を挿入する
値の順序が CREATE TABLE の定義と完全に一致する場合、複数行にわたって列名を省略できます。
INSERT INTO customer
VALUES
(002367, 'Tom', '13900001234', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 23, '2018-03-02 10:00:00'),
(002368, 'Alex', '13900001111', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 28, '2018-08-01 11:00:00'),
(002369, 'Eric', '13900002222', 'Hangzhou', 1, '987300', 'West Lake', 'Cloud Town', 35, '2018-09-12 08:11:00');
キーが重複した場合に既存の行を更新する
ON DUPLICATE KEY UPDATE を使用すると、挿入された行が既存のプライマリキーと競合した場合に、競合を無視する代わりに特定の列を更新します。
INSERT INTO customer
VALUES
(002367, 'Alan', '13900001234', 'Hangzhou', 0, '987300', 'West Lake', 'Cloud Town', 23, '2018-03-02 10:00:00')
ON DUPLICATE KEY
UPDATE age = 23;
AnalyticDB for MySQL におけるINSERT INTOのデフォルトの動作はINSERT IGNORE INTOと同等です。ON DUPLICATE KEY UPDATEはその動作をオーバーライドし、競合を無視する代わりに更新を実行します。
タイムスタンプ列を持つ行を挿入する
NOW() を使用して、挿入時の現在のタイムスタンプを記録します。
INSERT INTO courses (name, submission_date)
VALUES ('Jams', NOW());
クエリ結果から行を挿入する
SELECT 文をデータソースとして使用します。構文と例については、「INSERT SELECT FROM」をご参照ください。
次のステップ
-
INSERT SELECT FROM — 別のテーブルからクエリ結果を挿入する
-
CREATE TABLE — テーブルスキーマ、分散キー、パーティションを定義する