データ操作(SQL文)データ置換(REPLACE文)
REPLACE文について
unknown
REPLACE文は、INSERT文とUPDATE文を合体させたようなものです。
挿入するデータが既にテーブルに存在する場合は、新しくレコードを挿入せず、既存のレコードを新しいデータで上書き(置換)します。(UPDATE文と同じ)
逆に、挿入するデータがテーブルに存在しない場合は、新規レコードを挿入します(INSERT文と同じ)。
またREPLACE文は、INSERT文同様、SELECT文の結果を挿入することが可能です。
INSERT INTO テーブル名(フィールド名) VALUES (値) SELECT 文; REPLACE INTO テーブル名(フィールド名) VALUES (値) SELECT 文;
データのみ指定して、レコード挿入・置換
unknown
REPLACE INTO テーブル名 VALUES (値1[, 値2, ...]);
# MySQLログイン、データベース選択 C:\mysql\bin> mysql -u root -p db_User Enter Enter password: ***** Enter Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5696 to server version: 4.0.26-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. # テーブルtbl_CustomerBの中身を確認 mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | 研二 | 羽山 | m | 45 | ←このレコードを置換 +--------+-----------+----------+------+------+ 3 rows in set (0.44 sec) ##### レコード置換 # 主キーUserIDが'P003'のレコードを置換 mysql> REPLACE INTO tbl_CustomerB VALUES ('P003','kenji','hayama','m','40'); Enter Query OK, 2 rows affected (0.00 sec) # レコードが置換されているかテーブルtbl_CustomerBの中身を確認 mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | kenji | hayama | m | 40 | ←レコード「上書き」 +--------+-----------+----------+------+------+ 3 rows in set (0.00 sec) ##### レコード挿入 # 主キーUserIDが'P004'のレコードを挿入 mysql> REPLACE INTO tbl_CustomerB VALUES ('P004','太郎','鈴木','m',20); Enter Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | kenji | hayama | m | 40 | | P004 | 太郎 | 鈴木 | m | 20 | ←レコード「挿入」 +--------+-----------+----------+------+------+ 4 rows in set (0.00 sec) mysql>
カラム名とデータを指定して、レコード挿入・置換
unknown
REPLACE INTO テーブル名(フィールド1[, フィールド2, ...) VALUES (値1[, 値2, ...]);
# MySQLログイン、データベース選択 C:\mysql\bin> mysql -u root -p db_User Enter Enter password: ***** Enter Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5696 to server version: 4.0.26-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. # テーブルtbl_CustomerBの中身を確認 mysql> SELECT * FROM tbl_CustomerB; +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | kenji | hayama | m | 40 | ←このデータを置換 | P004 | 太郎 | 鈴木 | m | 20 | +--------+-----------+----------+------+------+ 4 rows in set (0.00 sec) ##### カラム名とデータを指定してレコード置換 # 主キーUserIDが'P003'のレコードを置換 mysql> REPLACE INTO tbl_CustomerB (UserID, FirstName, LastName) Enter -> VALUES ('P003','研二','羽山'); Enter Query OK, 2 rows affected (0.00 sec) # 指定しなかったカラムのデータには「NULL」が挿入されます mysql> SELECT * FROM tbl_CustomerB; +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | 研二 | 羽山 | NULL | NULL | ←レコード「上書き」 | P004 | 太郎 | 鈴木 | m | 20 | +--------+-----------+----------+------+------+ 4 rows in set (0.00 sec) # テーブルの全カラムを指定すれば、該当するレコードが全て上書きされます mysql> REPLACE INTO tbl_CustomerB (UserID, FirstName, LastName, Sex, Age) Enter -> VALUES ('P003','研二','羽山','m',30); Enter Query OK, 2 rows affected (0.00 sec) mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | 研二 | 羽山 | m | 30 | ←レコード「上書き」 | P004 | 太郎 | 鈴木 | m | 20 | +--------+-----------+----------+------+------+ 4 rows in set (0.00 sec) ##### レコード挿入(一致するデータがない場合) # 主キーUserIDが'P005'のレコードを挿入 mysql> REPLACE INTO tbl_CustomerB (UserID, FirstName, LastName, Sex, Age) Enter -> VALUES ('P005','花子','日本','f',15); Enter Query OK, 1 row affected (0.01 sec) # レコードが挿入されているか確認 mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | 研二 | 羽山 | m | 30 | | P004 | 太郎 | 鈴木 | m | 20 | | P005 | 花子 | 日本 | f | 15 | ←レコード「挿入」 +--------+-----------+----------+------+------+ 5 rows in set (0.00 sec) mysql>
SELECT文の結果を挿入
unknown
REPLACE INTO テーブル名(フィールド名) VALUES (値) SELECT 文;
# テーブルtbl_CustomerAの中身確認 mysql> SELECT * FROM tbl_CustomerA; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | U001 | 花子 | 鈴木 | f | 21 | | U002 | 太郎 | 田中 | m | 30 | ←このデータをtbl_CustomerBに挿入 | U003 | 一郎 | 鈴木 | m | 45 | | U004 | 萌子 | 山口 | f | 18 | | U005 | 愛 | 森永 | f | 21 | | U006 | 太郎 | 鈴木 | m | 22 | | U007 | 花子 | 佐藤 | f | 35 | +--------+-----------+----------+------+------+ 7 rows in set (0.00 sec) # テーブルtbl_CustomerBの中身確認 mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | 研二 | 羽山 | m | 45 | +--------+-----------+----------+------+------+ 3 rows in set (0.00 sec) # テーブルtbl_CustomerAのUserIDが'U002'のデータを # テーブルtbl_CustomerBに挿入 mysql> REPLACE INTO tbl_CustomerB Enter -> SELECT * FROM tbl_CustomerA WHERE UserID='U002'; Enter Query OK, 1 row affected (0.06 sec) Records: 1 Duplicates: 0 Warnings: 0 # データが追加されているかテーブルtbl_CustomerBの中身を確認 mysql> SELECT * FROM tbl_CustomerB; Enter +--------+-----------+----------+------+------+ | UserID | FirstName | LastName | Sex | Age | +--------+-----------+----------+------+------+ | P001 | まなみ | 青山 | f | 43 | | P002 | 綾子 | 沢崎 | f | 36 | | P003 | 研二 | 羽山 | m | 45 | | U002 | 太郎 | 田中 | m | 30 | +--------+-----------+----------+------+------+ 4 rows in set (0.00 sec) mysql>
このページで使用しているサンプルデータ
unknown
サンプルデータ
### データベース(db_User)作成 CREATE DATABASE IF NOT EXISTS db_User; ###データベース選択 USE db_User; ### テーブル(tbl_CustomerA)作成 CREATE TABLE tbl_CustomerA( UserID VARCHAR(4) NOT NULL PRIMARY KEY, FirstName VARCHAR(32) NOT NULL, LastName VARCHAR(32) NOT NULL, Sex CHAR(2) DEFAULT NULL, Age INTEGER DEFAULT NULL ); # データ挿入 INSERT INTO tbl_CustomerA (UserID,FirstName,LastName,Sex,Age) VALUES ('U001','花子','鈴木','f',21), ('U002','太郎','田中','m',30), ('U003','一郎','鈴木','m',45), ('U004','萌子','山口','f',18), ('U005','愛','森永','f',21), ('U006','太郎','鈴木','m',22), ('U007','花子','佐藤','f',35); ### テーブル(tbl_CustomerB)作成 CREATE TABLE IF NOT EXISTS db_User.tbl_CustomerB( UserID VARCHAR(4) NOT NULL PRIMARY KEY, FirstName VARCHAR(32) NOT NULL, LastName VARCHAR(32) NOT NULL, Sex CHAR(2) DEFAULT NULL, Age INTEGER DEFAULT NULL ); # データ挿入 INSERT INTO tbl_CustomerB (UserID,FirstName,LastName,Sex,Age) VALUES ('P001','まなみ','青山','f',43), ('P002','綾子','沢崎','f',36), ('P003','研二','羽山','m',45);