mysql - tipos - Insertar usando LEFT JOIN y INNER JOIN
tipos de join mysql (2)
Hola, estoy tratando de encontrar la manera de insertar un nuevo registro con la siguiente consulta:
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 consulta INSERT
hasta ahora es esta:
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)
cuando se usan uniones hacia la izquierda y hacia adentro.
Entonces, lo que estoy buscando hacer es esto:
Tabla de User
:
id | name | username | password | OptIn
--------------------------------------------------------------------
562 Bob Barker bBarker [email protected] 1
Y también la tabla user_permission
user_id | Permission_id
-------------------------
562 4
ACTUALIZAR Así que así?
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);
Debe ser específico sobre las columnas que está seleccionando. Si su tabla de user
tenía cuatro columnas id, name, username, opted_in
, debe seleccionar exactamente esas cuatro columnas de la consulta. La sintaxis se ve así:
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 el user
. De hecho, este INSERT
parece destinado a fallar con violaciones de singularidad de clave primaria.
MySQL no admite inserciones en varias tablas al mismo tiempo. O necesita realizar dos INSERT
en su código, utilizando la última identificación de inserción desde la primera consulta, o crear un desencadenador 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 usando 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
no puede usar la cláusula VALUES
cuando inserta datos usando otra consulta SELECT
. ver INSERTAR SINTAXIS
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
);