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