使用LEFT JOIN和INNER JOIN插入

时间:2012-08-22 12:47:48

标签: mysql left-join inner-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;
到目前为止,

我的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);

3 个答案:

答案 0 :(得分:46)

您必须具体了解所选的列。如果您的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

但是,似乎没有任何理由在此处加入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)

或使用trigger

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

答案 1 :(得分:18)

使用其他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
);

答案 2 :(得分:0)

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)
相关问题