58

次のクエリを使用して、新しいレコードを挿入する方法を理解しようとしています。

SELECT user.id, user.name, user.username, user.email, 
  IF(user.opted_in = 0, 'NO', 'YES') AS optedIn  
FROM 
  user
  LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id
ORDER BY user.id;

これまでの私のINSERT質問はこれです:

INSERT INTO user 
SELECT * 
FROM user 
  LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id;

VALUE('','','','', etc etc)ただし、左結合と内部結合を使用する場合の方法がわかりません。

だから私がやろうとしているのはこれです:

Userテーブル:

id    | name       | username    | password                 | OptIn
--------------------------------------------------------------------
562     Bob Barker   bBarker       BBarker@priceisright.com   1

そしてまたuser_permissionテーブル

user_id   | Permission_id
-------------------------
562         4

更新 だからこのように?

INSERT INTO user (name, username, password, email, opted_in) VALUES ('Bbarker','Bbarker','blahblahblah','Bbarker@priceisright.com',0);
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(),4);
4

3 に答える 3

77

選択する列について具体的にする必要があります。userテーブルに4つの列がある場合id, name, username, opted_inは、クエリからそれらの4つの列を正確に選択する必要があります。構文は次のようになります。

INSERT INTO user (id, name, username, opted_in)
  SELECT id, name, username, opted_in 
  FROM user LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id

user_permissionただし、そのテーブルのどの列もに挿入されないため、ここで結合する理由はないようuserです。実際、これINSERTは主キーの一意性違反で失敗するようです。

MySQLは、同時に複数のテーブルへの挿入をサポートしていません。INSERT最初のクエリの最後の挿入IDを使用して、コードで2つのステートメントを実行するかAFTER INSERT、プライマリテーブルにトリガーを作成する必要があります。

INSERT INTO user (name, username, email, opted_in) VALUES ('a','b','c',0);
/* Gets the id of the new row and inserts into the other table */
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(), 4)

またはトリガーを使用する:

CREATE TRIGGER creat_perms AFTER INSERT ON `user`
FOR EACH ROW
BEGIN
  INSERT INTO user_permission (user_id, permission_id) VALUES (NEW.id, 4)
END
于 2012-08-22T12:50:05.217 に答える
24

別のクエリVALUESを使用してデータを挿入する場合、句を使用することはできません。構文の挿入SELECTを参照してください

INSERT INTO user
(
 id, name, username, email, opted_in
)
(
    SELECT id, name, username, email, opted_in
    FROM user
         LEFT JOIN user_permission AS userPerm
            ON user.id = userPerm.user_id
);
于 2012-08-22T12:50:22.647 に答える
3
INSERT INTO Test([col1],[col2]) (
    SELECT 
        a.Name AS [col1],
        b.sub AS [col2] 
    FROM IdTable b 
    INNER JOIN Nametable a ON b.no = a.no
)
于 2019-04-20T05:58:04.307 に答える