使用LEFT JOIN和INNER JOIN插入

Ste*_*hRT 40 mysql inner-join left-join

嘿所有我试图找出如何使用以下查询插入新记录:

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;
Run Code Online (Sandbox Code Playgroud)

INSERT到目前为止,我的查询是:

INSERT INTO user 
SELECT * 
FROM user 
  LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id;
Run Code Online (Sandbox Code Playgroud)

但是,我不确定VALUE('','','','', etc etc)在使用左连接和内连接时该怎么做.

所以我要做的是:

User 表:

id    | name       | username    | password                 | OptIn
--------------------------------------------------------------------
562     Bob Barker   bBarker       BBarker@priceisright.com   1
Run Code Online (Sandbox Code Playgroud)

还有user_permission桌子

user_id   | Permission_id
-------------------------
562         4
Run Code Online (Sandbox Code Playgroud)

更新 这样吗?

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);
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 53

您必须具体说明您选择的列.如果您的user表有四列id, name, username, opted_in,则必须从查询中精确选择这四列.语法如下:

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
Run Code Online (Sandbox Code Playgroud)

但是,似乎没有任何理由在user_permission此处加入,因为该表中的任何列都不会插入user.实际上,这INSERT似乎必然会因主键唯一性违规而失败.

MySQL不支持同时插入多个表.您需要INSERT在代码中执行两个语句,使用第一个查询中的最后一个插入ID,或者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)
Run Code Online (Sandbox Code Playgroud)

或使用触发器:

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
Run Code Online (Sandbox Code Playgroud)

  • @StealthRT 如果没有多个语句或第一个表上的触发器,则无法将新行插入到 2 个表中。 (2认同)
  • @StealthRT是的,就像那样 - 但你必须在第一个之后立即执行第二个,否则`LAST_INSERT_ID()`的值将变为无效.`LAST_INSERT_ID()`是依赖于连接的,因此只要在同一连接上顺序执行它们,您就会得到正确的值.如果其间发生任何其他插入,则会得到错误的值. (2认同)

Ome*_*esh 19

VALUES使用其他SELECT查询插入数据时,不能使用子句.请参阅INSERT SYNTAX

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
);
Run Code Online (Sandbox Code Playgroud)