LoginSignup
29
24

More than 5 years have passed since last update.

MySQL で JOIN を含む INSERT, UPDATE, DELETE 文

Posted at

なかなか覚えられない。MySQL 5.6。

👇下記の例で使うスキーマ。

CREATE TABLE authors (
  id        INT           NOT NULL AUTO_INCREMENT,
  name      VARCHAR(255)  NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE entries (
  id        INT           NOT NULL AUTO_INCREMENT,
  author_id INT           NOT NULL,
  title     VARCHAR(255)  NOT NULL,
  body      TEXT,
  available TINYINT(1)    NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE tags (
  entry_id  INT           NOT NULL,
  name      VARCHAR(255)  NOT NULL,
  PRIMARY KEY (entry_id, name)
);

INSERT 文

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.1 INSERT ... SELECT 構文

-- JOIN 使わない場合
INSERT INTO tags (entry_id, name)
  VALUES (1, 'rails');

-- VALUES の代わりに JOIN を含む SELECT の結果を使う
INSERT INTO tags (entry_id, name)
  SELECT entries.id, LOWER(authors.name)
    FROM entries JOIN authors ON entries.author_id = authors.id;

UPDATE 文

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.11 UPDATE 構文

-- JOIN 使わない場合
UPDATE entries
  SET title = 'My 1st entry', body = 'Title only'
  WHERE id = 1;

-- テーブル名を指定するところで JOIN
UPDATE entries JOIN authors ON entries.author_id = authors.id
  SET available = TRUE
  WHERE authors.name = 'labocho';

DELETE 文

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.2 DELETE 構文

-- JOIN 使わない場合
DELETE FROM entries
  WHERE entry_id = 1;

-- DELETE table_name FROM table_references ...
DELETE entries FROM entries JOIN authors ON entries.author_id = authors.id
  WHERE authors.name = 'labocho';
29
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
24