2016-11-21 2 views
0

Kann mir bitte jemand sagen, warum das passiert. Das ursprüngliche Problem ist wie immer viel komplexer, aber ich habe einen einfachen Testfall erstellt, um das Problem zu reproduzieren. Zuerst müssen Sie eine Tabelle wie folgt:SQL Kann den Namen der Primärschlüsselspalte nach dem Ändern der anderen Spalte nicht ändern

CREATE TABLE `test` (
    `test_a` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `test_b` int(11) DEFAULT NULL, 
    PRIMARY KEY (`test_a`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Dann müssen Sie versuchen, die Tabelle mit dieser Abfrage zu ändern:

ALTER TABLE `test` 
    CHANGE COLUMN `test_b` `new_test_b` INT(11) NOT NULL AFTER `test_a`, 
    CHANGE COLUMN `test_a` `new_test_a` INT(11) NOT NULL AUTO_INCREMENT FIRST; 

und Sie das Ergebnis:

Unknown column 'test_a' in 'test' 

I don versteh es nicht. Es funktioniert gut, wenn Sie jede Änderung separat machen, aber wenn Sie sie zusammen machen, explodiert es.


Nachtrag ...

Danach etwas studieren, dachte ich, ein paar Dinge aus. Ich nahm an, dass der Compiler (oder Präprozessor oder etwas) die durch Komma getrennten alter-Anweisungen in umgekehrter Reihenfolge auswertete, indem er den Spaltennamen test_a änderte, bevor er test_b bekam (was den 'AFTER test_a' Teil nicht machen würde) Sinn machen .. Dies erwies sich in Tests falsch zu sein, denn wenn man die Reihenfolge der Aussagen umkehren wie folgt:.

ALTER TABLE `test 
    CHANGE COLUMN `test_a` `new_test_a` INT(11) NOT NULL AUTO_INCREMENT FIRST, 
    CHANGE COLUMN `test_b` `new_test_b` INT(11) NOT NULL AFTER `test_a`; 

Sie mit dem gleichen Ergebnis am Ende

Next ich die Annahme war, dass bestimmte In einer solchen Anweisung haben Operationstypen Vorrang: Ich ging davon aus, dass alle CHANGE COLUMN-Operationen vor den Operationen zur Reihenfolge der Spalten wie 'AFTER test_a' stattfinden müssen. Ist dies der Fall war, dann wäre es sinnvoll, die neuen Spaltennamen in der Reihenfolge Operation zu verweisen, etwa so:

ALTER TABLE `test` 
    CHANGE COLUMN `test_b` `new_test_b` INT(11) NOT NULL AFTER `new_test_a`, 
    CHANGE COLUMN `test_a` `new_test_a` INT(11) NOT NULL AUTO_INCREMENT FIRST; 

Das funktionierte. Das muss also die Antwort sein. Meine Frage, die ich vermutete, hat sich jetzt zu der Reihenfolge des Vorrangs der verschiedenen Arten von Operationen entwickelt.

Hinweis, tut mir leid, ich werde keine der aktuellen Antworten richtig markieren, da sie die Frage nicht wirklich beantworten, sie bieten einfach alternative Möglichkeiten, das Gleiche zu tun (oder das Offensichtliche zu sagen).

+2

es sein könnte, weil es testa erste ist die Umbenennung, da die Abhängigkeit von Test eines in der ersten alten Aussage ist und dann zu versuchen, testb nach testa zu ändern. Aber da testa jetzt umbenannt wird, ist das der Fehler. Aber Sie müssen die Dokumentation von alter überprüfen, um 100% sicher zu sein. – Swetha

+0

das ist der Antwort am nächsten, die ich denke, daher die upvote –

Antwort

0

Sie können es auf diese Weise tun:

ALTER TABLE `test` 
    CHANGE COLUMN `test_b` `new_test_b` INT(11) NOT NULL AFTER `test_a`; 
ALTER TABLE `test` 
    CHANGE COLUMN `test_a` `new_test_a` INT(11) NOT NULL AUTO_INCREMENT FIRST; 
+0

ja, er hat bereits getan, dass es scheint – e4c5

Verwandte Themen