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?

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.


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 ...


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 

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


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


-2

Die richtige Syntax für Ihre Abfrage lautet:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.