INSERT mit SELECT

287

Ich habe eine Abfrage, die mit einer Auswahl eingefügt wird:

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

Ist es möglich, nur "Name, Ort" für die Einfügung auszuwählen und gid auf etwas anderes in der Abfrage zu setzen?

Kyle
quelle

Antworten:

547

Ja, absolut, aber überprüfen Sie Ihre Syntax.

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

Sie können eine Konstante des gleichen Typs wie gidan ihre Stelle setzen, natürlich nicht nur 1. Und ich habe gerade den cidWert erfunden.

Andrew
quelle
2
Hat funktioniert, vielen Dank. Bei Auswahl einfügen wird die Klammer für Feldnamen nicht benötigt. Wenn Sie jedoch anfangen, Werte über der Auswahl anzugeben, benötigen Sie anscheinend () um die Feldnamen.
Kyle
Beachten Sie, dass Sie in der Einfügeklausel keine Aliase verwenden können: "INSERT INTO-Kurse t1 (t1.name, t1.location, t1.gid) [...]
schlagen
@ Andrew Gibt es eine Methode, um dieselbe Auswahl zurückzugeben, ohne das nächste Mal select auszuführen? wenn ich einfügen und das Ergebnis der
Kurstabelle erhalten möchte
1
@TAHASULTANTEMURI Andere Frage. Wenn ich jedoch verstehe, was Sie fragen, hat SQL Server (nicht was gefragt wurde, sondern was ich heutzutage verwende) die OUTPUTKlausel , mit der Sie alles, was Sie eingefügt haben, auch in eine andere Tabelle einfügen können. Ich glaube nicht, dass MySQL ein Äquivalent hat. Sie können eine temporäre Tabelle erstellen , in diese Tabelle auswählen, dann coursesaus dieser Tabelle füllen und dann die temporäre Tabelle für alles verwenden, was Sie sonst noch benötigen.
Andrew
31

Ja, so ist es. Du kannst schreiben :

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

oder Sie können Werte von einem anderen Join der Auswahl erhalten ...

Dumitrescu Bogdan
quelle
INSERT INTO Kursname, Speicherort, gid SELECT Name, Speicherort, '$ this-> gid' FROM Kurse WHERE cid = $ cid - Ich erhalte den Fehler: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'Name, Ort, gid SELECT-Name, Ort,' 22 'FROM Kurse WHERE cid = 23' in Zeile 1
Kyle
Ich denke, Ihr GID-Feld ist eine ganze Zahl, also: '22' muss 22 sein. Ändern Sie '$ this-> gid' durch $ this-> gid
Alex Reche Martinez
22 und '22' sollten für SQL keine Rolle spielen, aber ich setze eine Zeichenfolge, falls das Feld einem eindeutigen Bezeichner ähnlich ist.
Dumitrescu Bogdan
8

Richtige Syntax: Rechtschreibung auswählen war falsch

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

Klar, was willst du für das GID verwenden? ein statischer Wert, PHP var, ...

Ein statischer Wert von 1234 könnte sein wie folgt:

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

Natürlich kannst du.

Eines sollte jedoch beachtet werden: Die INSERT INTO SELECTAnweisung kopiert Daten aus einer Tabelle und fügt sie in eine andere Tabelle ein UND erfordert, dass die Datentypen in Quell- und Zieltabellen übereinstimmen. Wenn die Datentypen aus den angegebenen Tabellenspalten nicht übereinstimmen (dh versuchen, sie VARCHARin INToder TINYINTin sie einzufügen) , löst INTder MySQL-Server eine aus SQL Error (1366).

Also sei vorsichtig.

Hier ist die Syntax des Befehls:

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

Randnotiz: Es gibt eine Möglichkeit, das Problem beim Einfügen verschiedener Spaltentypen zu umgehen, indem Sie Casting in Ihrem SELECTBeispiel verwenden:

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

Diese Konvertierung ( CAST()ist ein Synonym für CONVERT()) ist sehr nützlich, wenn Ihre Tabellen unterschiedliche Zeichensätze in derselben Tabellenspalte haben (was bei unsachgemäßer Behandlung möglicherweise zu Datenverlust führen kann).

Bud Damyanov
quelle
-2

Die richtige Syntax für Ihre Abfrage lautet:

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