2012-08-22 138 views
27

嘿我试图找出如何去使用VB.net下面的查询串中插入一个新的记录:插入使用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  [email protected] 1 

而且还user_permission

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

UPDATE 所以这样吗?

INSERT INTO user (name, username, password, email, opted_in) VALUES ('Bbarker','Bbarker','blahblahblah','[email protected]',0); 
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(),4); 
+0

为什么刚刚从'user'中选择值时插入'user'?你打算插入什么新行? –

回答

29

你必须要具体谈谈您选择的列。如果您的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不支持同时插入多个表。您需要使用第一个查询中的最后一个插入ID在代码中执行两条INSERT语句,或者在主表上创建一个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 
+0

我需要在user_permission表中以及在用户表的旁边插入一行。我会怎么做? – StealthRT

+0

更新我的OP以更好地解释我正在寻找的内容。 – StealthRT

+0

@StealthRT不能在没有多个语句或第一个表上的触发器的情况下将新行插入到2个表中。 –

15

使用其他SELECT查询插入数据时不能使用VALUES条款。请参阅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 
); 
+0

感谢您花时间回复Omesh! – StealthRT