2017-02-24 3 views
0

Ich möchte eine INSERT INTO-Abfrage haben, welche eines der Felder, die ich aktualisiere, ist eine berechnete var 'mycount' - die die Nummer der eingefügten Zeile in der Abfrage sein wird.INSERT INTO mit Inkrement Variable

Zum Beispiel: Wenn ich 3 Zeilen einfüge, möchte ich, dass diese Variable "1" für die erste Zeile, "2" für die zweite und so weiter ist.

SET @mycount=0; 
INSERT INTO my_table 
(@mycount,field1,field2,field3...) 
SET @[email protected]+1; 
SELECT @mycount,field1,field2,field3.. 
FROM my_table 
WHERE id IN (id1,id2,id3..); 

Dieser Code gibt einen Fehler zurück. Wie kann ich eine Variable innerhalb einer INSERT INTO-Abfrage deklarieren und mit jeder eingefügten Zeile erhöhen?

WICHTIG - Ich brauche keine AUTO-INCREMENT-Spalte - dies ist ein Teil einer Berechnung, die nur in dieser spezifischen INSERT INTO-Abfrage ausgeführt werden muss, und sie ist nur ein Teil der Berechnung. Was ich brauche, ist wirklich eine Berechnung von (number_of_inserted_row + some_other_calculation), aber ich habe es nur für die Frage vereinfacht.

+1

Warum nicht 'auto_increment' verwenden? –

+0

Sie können dies tun, indem Sie neues Feld hinzufügen, die Sie wie count_number einfügen und Auto Inkrement dieses Feld definieren und nicht in diese Abfrage –

+0

überprüfen möchten, überprüfen Update Antwort –

Antwort

1

Nun, normalerweise wird eine Spalte auto_increment dafür verwendet. Wenn Sie nicht aus irgendeinem Grund wollen, können Sie es wie folgt tun:

INSERT INTO my_table 
(your_quasi_auto_increment_column, field1, field2, field3...) 
SELECT (@mycount := @mycount + 1) + <other_calculation>, field1, field2, field3.. 
FROM my_table 
, (SELECT @mycount := 0) var_init_query_alias 
WHERE id IN (id1,id2,id3..); 
+0

Ich kann Auto-Inkrement nicht als Spalte verwenden, weil es eine spezifische ist nur, dass ich es brauche. Und der vollständige Ausdruck verwendet Auto-Inkrement nur als Teil davon. Ich brauche das Feld (Berechnung + Nummer_der_insertierten_Rose_in_aktuellen_Abfrage). Wenn ich also jedes Mal 5 Inserts mit je 3 Zeilen liefere, gibt es mir immer noch (1,2,3,4,5) anstelle einer ständig steigenden Primärnummer. Ich habe versucht, Ihre Abfrage auszuführen, aber es gibt einen Fehler .. – Yaron

+0

Ich habe es geschafft, Ihre Abfrage auszuführen .. (@mycount in der ersten INSERT INTO-Anweisung sollte ein Feldname sein). ABER - wenn ich möchte, dass meine Berechnung (@ mycount + andere Berechnungen) ist, wie mache ich das? – Yaron

+0

Ja, du hast recht, es sollte natürlich ein Feldname sein. Kopieren Sie es von Ihnen eingefügt und nicht bemerkt. Wenn Ihre "andere Berechnung" zu einer Zahl führt, können Sie mit einfachen arithmetischen Operatoren rechnen. Wenn es sich um einen Text handelt, verwenden Sie 'CONCAT()', um den Text und die Zahl zusammenzufügen. Haben Sie eine spezifische Fehlermeldung? Was funktioniert bei deiner Berechnung nicht? – fancyPants

0

Sie tun können, dieses Add mit neuen abgelegt, die Sie als wie count_number einfügen möchten, und Autoinkrement definieren diese abgelegt und nicht brauchen in dieser Abfrage

SET @test=1; 
INSERT INTO test (`test`,`test2`,`test3`) 
SELECT (@test := @test +1) AS `test`,`test2`,`test3` 
FROM test 

, wenn Sie neue Datei überprüfen dann dann diesen Code

SET @count_value=0; 
INSERT INTO test (`count_value`,`test`,`test2`,`test3`) 
SELECT (@count_value := @count_value +1) AS `count_value`,`test`,`test2`,`test3` 
FROM test 

in my_table1 hinzufügen Feld count_number hinzufügen möchten einfügen und geben Sie in t und fügen Auto-Inkrement dann wird es funktionieren

+0

Aber ich brauche keinen Primärschlüssel .. Ich habe bereits einen. Nur in der INSERT INTO-Abfrage, die ich ausführe, möchte ich, dass ein bestimmtes Feld den Wert von (number_of_inserted_row + another_number) erhält. Wenn ich die Abfrage einmal ausführen und 2 Zeilen einfügen, sollte es (1 + another_number), (2 + another_number) sein.Wenn ich es wieder mit 3 Zeilen lief, sollte es (1 + another_number), (2 + another_number), (3 + another_number) sein. – Yaron

+0

überprüfen Sie diese Update-Antwort –