2012-08-22 18 views
27

Hola a todos Estoy tratando de encontrar la manera de ir sobre la inserción de un nuevo registro utilizando la siguiente cadena de consulta en VB.net:Insertar usando LEFT JOIN y 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; 

Mi INSERT consulta hasta el momento es la siguiente:

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

Sin embargo, no estoy seguro de cómo hacer VALUE('','','','', etc etc) al usar las uniones izquierda e interna.

Así que lo que estoy buscando que hacer es esto:

User tabla:

id | name  | username | password     | OptIn 
-------------------------------------------------------------------- 
562  Bob Barker bBarker  [email protected] 1 

Y también el user_permission mesa

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

ACTUALIZACIÓN Así como esto?

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

¿Por qué estás insertando en 'usuario' cuando acabas de seleccionar valores de' usuario'? ¿Qué nueva fila pretendes insertar? –

Respuesta

29

Tiene que ser específico sobre las columnas que está seleccionando. Si su tabla user tiene cuatro columnas id, name, username, opted_in, debe seleccionar exactamente esas cuatro columnas de la consulta. La sintaxis es la siguiente:

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 

Sin embargo, no parece haber ninguna razón para unirse contra user_permission aquí, ya que ninguna de las columnas de esa tabla se insertaría en user. De hecho, este INSERT parece obligado a fallar con violaciones de singularidad de clave primaria.

MySQL no admite inserciones en varias tablas al mismo tiempo. O bien debe realizar dos instrucciones INSERT en su código, utilizando la última identificación de inserción de la primera consulta, o crear un desencadenante AFTER INSERT en la tabla principal.

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) 

o utilizando un 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

Tengo la necesidad de insertar una fila en la tabla user_permission además de en la tabla del usuario. ¿Como podría hacerlo? – StealthRT

+0

Actualicé mi OP para explicar mejor lo que estaba buscando hacer. – StealthRT

+0

@StealthRT No puede insertar nuevas filas en 2 tablas sin declaraciones múltiples, o un disparador en la primera tabla. –

15

no se puede utilizar la cláusula VALUES al insertar datos utilizando otra consulta SELECT. ver 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

Gracias por tomarse el tiempo para responder con una respuesta, Omesh! – StealthRT