SQLでデータを更新するにはUPDATE文を使います。
今回もMySQLをもとにしていますが、ほとんど他DBでも流用できる内容です。
目次
UPDATEの文法
更新したいテーブル名、カラムとその値、更新対象の条件を指定します。
更新したいカラムが複数の場合はカンマで区切ります。
UPDATE <テーブル名> SET <カラム名>=<値>,<カラム名>=<値>,... WHERE 任意の条件文;
UPDATE文の具体例
以下のようなユーザー情報と権限のテーブルがを例にしましょう。
CREATE TABLE IF NOT EXISTS role (
-- 権限のID
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-- 権限の名前。adminやゲストなどの値が入る
role_name VARCHAR(20) NOT NULL
);
CREATE TABLE IF NOT EXISTS user (
-- ユーザーのID。自動で付与される
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-- ユーザー名
name VARCHAR(20) NOT NULL,
-- パスワード
password VARCHAR(256) NOT NULL,
-- データ作成日時
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-- データ更新日時
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE current_timestamp,
-- ユーザーが持っている権限のID
role_id INT NOT NULL,
-- ユーザーが持っている権限IDを、権限テーブルに紐づける
FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE RESTRICT ON UPDATE RESTRICT
);
事前にこちらのSQL文でダミーデータを作成します。
INSERT INTO role (role_name) VALUES
('admin'),
('member'),
('guest')
;
INSERT INTO user(name, password, role_id) VALUES('テストテスト', 'test_password', 2);
INSERT INTO user(name, password, role_id) VALUES
('adminユーザー', 'test_password', (SELECT id FROM role WHERE role_name='admin')),
('テスト太郎', 'test_password', 2),
('テスト次郎', 'test_password', 2),
('test test', 'test_password', 2),
('メンバーからゲストになる人', 'test_password', 2),
('テストユーザー', 'test_password', (SELECT id FROM role WHERE role_name='member')),
('ゲストからメンバーになる人', 'test_password', (SELECT id FROM role WHERE role_name='guest')),
('ゲストユーザー2', 'test_password', (SELECT id FROM role WHERE role_name='guest'))
;
INSERT INTO user_address(user_id, zip_code, address, building) VALUES
((SELECT id FROM user WHERE name='テスト太郎'), "111-1111", "テスト住所", "テストビルディング"),
((SELECT id FROM user WHERE name='テスト次郎'), "211-1111", "テスト住所2", "テストビルディング2"),
((SELECT id FROM user WHERE name='test test'), "311-1111", "テスト住所3", "テストビルディング3"),
((SELECT id FROM user WHERE name='テストユーザー'), "411-1111", "テスト住所4", "テストビルディング4")
;
テーブルの中身は以下のようになっています。
これらのデータが入った状態で以下のUPDATE文を実行してみましょう。
-- 1つのカラムだけ更新
-- 名前が「メンバーからゲストになる人」権限IDをmember(2) -> guest(3)に修正
UPDATE user SET role_id=3
WHERE name='メンバーからゲストになる人';
-- 複数カラム更新
-- 名前が「テスト太郎」の行の名前とパスワード更新
UPDATE user SET name='テスト 太郎',password='hogehoge'
WHERE name='テスト太郎';
-- SET部分でサブクエリ
-- 名前が「ゲストからメンバーになる人」の権限IDをguest(3) -> member(2)に修正
UPDATE user SET role_id=(SELECT id FROM role WHERE role_name='member')
WHERE name='ゲストからメンバーになる人';
-- WHERE部分でサブクエリ
-- 権限名がadminのユーザーのパスワードを変更
UPDATE user SET password='ADMIN_PASSWORD'
WHERE role_id=(SELECT id FROM role WHERE role_name='admin');
実行した後のテーブルの中身は以下の通りです。

サブクエリの書き方
具体例でも出てますが、SET・WHERE部分でサブクエリを書けます。
WHERE部分はSELECT文のWHERE句と同様です。
SET部分は<カラム名>=(<サブクエリ>)で適用できます。サブクエリを()でくくる必要があります。
UPDATE <テーブル名> SET <カラム名>=(<サブクエリ>) WHERE <任意の条件文>;
サブクエリを使用した具体例を再掲します。
-- SET部分でサブクエリ
-- 名前が「ゲストからメンバーになる人」の権限IDをguest(3) -> member(2)に修正
UPDATE user SET role_id=(SELECT id FROM role WHERE role_name='member')
WHERE name='ゲストからメンバーになる人';
-- WHERE部分でサブクエリ
-- 権限名がadminのユーザーのパスワードを変更
UPDATE user SET password='ADMIN_PASSWORD'
WHERE role_id=(SELECT id FROM role WHERE role_name='admin');
INSERTについてはこちらの記事にあげているのでよかったら見てみてください。
参考サイト
- MySQL公式