INSÉRER avec SELECT

287

J'ai une requête qui insère en utilisant un select:

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

Est-il possible de sélectionner uniquement "nom, emplacement" pour l'insertion et de définir gid sur autre chose dans la requête?

Kyle
la source

Réponses:

548

Oui, absolument, mais vérifiez votre syntaxe.

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

Vous pouvez mettre une constante du même type qu'à gidsa place, pas seulement 1, bien sûr. Et, je viens de compenser la cidvaleur.

Andrew
la source
2
A travaillé, merci beaucoup. Avec Insert Select, les parenthèses ne sont pas requises autour des noms de champ. Mais lorsque vous commencez à spécifier des valeurs en haut de la sélection, vous avez apparemment besoin de () autour des noms de champ.
Kyle
Notez que vous ne pouvez pas utiliser d'alias dans la clause d'insertion: "INSERT INTO courses t1 (t1.name, t1.location, t1.gid) [...] échouera.
raphael
@Andrew existe-t-il une méthode pour renvoyer cette même sélection sans exécuter la sélection la prochaine fois? si je veux insérer et obtenir le résultat du tableau des cours
TAHA SULTAN TEMURI
1
@TAHASULTANTEMURI Question différente. Mais si je comprends ce que vous demandez, SQL Server (pas ce qui a été demandé, mais ce que j'utilise de nos jours) a la OUTPUTclause , qui vous permet également de mettre ce que vous avez inséré dans une autre table. Je ne pense pas que MySQL ait un équivalent. Vous pouvez créer une table temporaire , sélectionner dans cette table, puis remplir à coursespartir de cette table, puis utiliser la table temporaire pour tout ce dont vous avez besoin.
Andrew
31

Oui, ça l'est. Tu peux écrire :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

ou vous pouvez obtenir des valeurs d'une autre jointure de la sélection ...

Dumitrescu Bogdan
la source
INSERT INTO cours nom, emplacement, gid SELECT nom, emplacement, '$ this-> gid' FROM courses WHERE cid = $ cid - J'obtiens l'erreur: vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de 'nom, emplacement, gid SELECT nom, emplacement,' 22 'DES cours OERE cid = 23' à la ligne 1
Kyle
Je suppose que votre champ gid est un entier donc: '22' doit être 22. Changez '$ this-> gid' par $ this-> gid
Alex Reche Martinez
22 et '22' ne devraient pas avoir d'importance pour sql, mais j'ai mis une chaîne au cas où le champ serait similaire à un identifiant unique.
Dumitrescu Bogdan
8

Syntaxe correcte: l'orthographe sélectionnée était incorrecte

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 
RolandoMySQLDBA
la source
5

Bien sûr, que voulez-vous utiliser pour le gid? une valeur statique, PHP var, ...

Une valeur statique de 1234 pourrait ressembler à:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid
klennepette
la source
1

Bien sûr vous pouvez.

Il convient toutefois de noter une chose: l' INSERT INTO SELECTinstruction copie les données d'une table et les insère dans une autre table ET requiert que les types de données des tables source et cible correspondent. Si les types de données des colonnes de table données ne correspondent pas (c'est-à-dire en essayant de les insérer VARCHARdans INTou TINYINTdans INT) le serveur MySQL lancera un SQL Error (1366).

Donc sois prudent.

Voici la syntaxe de la commande:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

Note latérale: Il existe un moyen de contourner le problème d'insertion de différents types de colonnes en utilisant la conversion dans votre SELECT, par exemple:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Cette conversion ( CAST()synonyme de CONVERT()) est très utile si vos tables ont des jeux de caractères différents sur la même colonne de table (ce qui peut potentiellement entraîner une perte de données si elles ne sont pas gérées correctement).

Bud Damyanov
la source
-2

La bonne syntaxe pour votre requête est:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Martin Rafael Pérez Lara
la source