web-dev-qa-db-fra.com

Insérer avec LEFT JOIN et INNER JOIN

Bonjour à tous, j'essaie de comprendre comment insérer un nouvel enregistrement en utilisant la requête suivante:

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;

Ma requête INSERT à ce jour est la suivante:

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

Cependant, je ne suis pas sûr de savoir comment faire VALUE('','','','', etc etc) lors de l'utilisation des jointures gauche et interne.

Donc ce que je cherche à faire est la suivante:

User table:

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

Et aussi la table user_permission

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

UPDATE Alors, comme ça?

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);
39
StealthRT

Vous devez préciser les colonnes que vous sélectionnez. Si votre table user avait quatre colonnes id, name, username, opted_in vous devez sélectionner exactement ces quatre colonnes dans la requête. La syntaxe ressemble à:

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

Cependant, il ne semble y avoir aucune raison de s'unir contre user_permission ici, car aucune des colonnes de cette table ne serait insérée dans user. En fait, cette INSERT semble vouée à l'échec avec les violations d'unicité de clé primaire.

MySQL ne prend pas en charge les insertions dans plusieurs tables en même temps. Vous devez soit exécuter deux instructions INSERT dans votre code, en utilisant le dernier identifiant d'insertion de la première requête, soit créer un AFTER INSERT déclencheur sur la table primaire.

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)

Ou en utilisant 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
51
Michael Berkowski

vous ne pouvez pas utiliser la clause VALUES lors de l'insertion de données à l'aide d'une autre requête SELECT. voir 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
);
19
Omesh
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)
1
kajol