2008-10-15 11 views
9

Offensichtlich ist das folgende falsch.Wählen Sie aus der gleichen Tabelle wie ein Einfügen oder Aktualisieren

INSERT INTO `aTable` (`A`,`B`) VALUES((SELECT MAX(`A`) FROM `aTable`)*2),'name'); 

ich den Wert:

SQL-Abfrage:

INSERT INTO `aTable` (`A`, `B`) 
VALUES 
(
    (
    SELECT MAX(`A`) 
    FROM `aTable` 
) *2 
, 'name' 
) 

MySQL sagte:

1093 - Sie nicht Zieltabelle 'aTable' for update in FROM-Klausel angeben

Also, ich versuche, eine Bitmap-Tabelle zu machen, jede Zeile entspricht einem Bit, und hat eine 'map' va lue.

Um in die Tabelle einzufügen, möchte ich nicht zwei Abfragen durchführen, ich möchte eine tun. Wie soll ich das machen?

Niemand kommentiert, aber da ich versuche, eine Bitmap zu machen, sollte es sein * 2 nicht^2, mein Fehler, bitte beachten Sie, warum die Kommentare sagen oft^2, war es ein Fehler in der Version, die die Kommentatoren lesen.

Antwort

10

Versuch:

insert into aTable select max(a)^2, 'name' from aTable; 

oder

insert into aTable select max(a)^2, 'name' from aTable group by B; 

Wenn Sie ein beitreten möchten, können Sie dies tun:

insert into aTable select max(a)^2, 'name' from aTable, bTable; 

Mein "Server-Version" ist „5.0.51b- Community-nt MySQL Community Edition (GPL) "

1

Ich denke, Sie müssen die "VALUES" fallen lassen und eine gültige Select-Anweisung haben.

see this link

Ich bin nicht besonders ein mySQL Kerl, verwende ich MSSQL meistens. Aber wenn Sie die Select-Anweisung korrekt formatieren, sollte es funktionieren.

+0

Nein, ich versuche, aus der gleichen Tabelle wie die Einfügung zu wählen, und MySQL mag das nicht .. Sory, ich hatte die Abfrage beim ersten Mal nicht korrekt eingegeben, aber die Auswahl war immer noch korrekt . –

+0

hrm. Okay, hat mySQL benutzerdefinierte Funktionen? Sie können also eine Funktion erstellen, die das aktuelle "MAX (' A') "zurückgibt und in Ihrer Anweisung verwendet? – stephenbayer

+0

Es tut (gespeicherte Prozeduren), aber ich bin mir nicht sicher, ob Sie das noch tun können. Einen Versuch wert –

-1

Sobald die Auswahl korrekt ist, können Sie dies tun.

+1

Wenn ich die Auswahl als eine Abfrage von selbst ausführen, funktioniert es gut. –

5

Ich nehme an, dass INSERT ... SELECT nicht funktioniert? Ich sehe dies in der Dokumentation für sie:

Die Zieltabelle der INSERT Anweisung in der FROM Klausel des SELECT-Teils der Abfrage erscheinen. (Dies war in einigen älteren MySQL-Versionen nicht möglich.) In diesem Fall erstellt MySQL eine temporäre Tabelle , die die Zeilen aus SELECT enthält, und fügt dann diese Zeilen in die Zieltabelle ein.

Aus Neugier, welche Version von MySQL verwenden Sie?

+0

Der nächste Vorschlag wäre, wenn Sie eine ältere Version von MySQL verwenden, eine temporäre Tabelle zu verwenden, was die aktuellen Versionen von MySQL implizit tun. –

+0

..es sollte funktionieren # Serverversion: 5.0.45-Debian_1ubuntu3.3-log # Protokollversion: 10 –

8

Eigentlich , können Sie die Tabelle auf der Einfügung alias. Ich habe diese Frage überall gesehen, aber niemand hat das versucht. Verwenden Sie eine Unterabfrage, um den Maximalwert aus der Tabelle abzurufen, alias die Tabelle in der Unterabfrage.

INSERT INTO tableA SET fieldA = (SELECT max(x.fieldA) FROM tableA x)+1; 

Ein komplexeres Beispiel, in dem Sie eine entsprechende Sekundärschlüssel haben und könnte der erste Datensatz für den entsprechenden Sekundärschlüssel werden eingefügt:

INSERT INTO tableA SET secondaryKey = 123, fieldA = COALESCE((SELECT max(x.fieldA) FROM tableA x WHERE x.secondaryKey = 123)+1,1); 

durch Aliasing auf den Tisch, es nicht werfen die Fehler und scheint zu funktionieren. Ich habe gerade während der Programmierung etwas getan, obwohl ich nicht sehen kann, ob es irgendwelche albernen Syntaxfehler oben gibt, würde ich diese Art von Syntax versuchen.