Fügen Sie den Primärschlüssel für die automatische Inkrementierung in die vorhandene Tabelle ein


157

Ich versuche, eine Tabelle zu ändern, die weder einen Primärschlüssel noch eine Spalte auto_increment enthält. Ich weiß, wie man eine Primärschlüsselspalte hinzufügt, habe mich aber gefragt, ob es möglich ist, Daten automatisch in die Primärschlüsselspalte einzufügen (ich habe bereits 500 Zeilen in der Datenbank und möchte ihnen eine ID geben, aber ich möchte dies nicht manuell tun). . Irgendwelche Gedanken? Vielen Dank.


2
Sie können alter tableden Schlüssel problemlos hinzufügen, aber MySQL generiert keine IDs für Felder, die diese noch nicht haben. Sie müssen die vorhandenen Felder manuell aktualisieren und dann sicherstellen, dass Ihr neues auto_increment mit dem richtigen Versatz beginnt. Der Standardwert ist "1", und Sie erhalten sowieso nur doppelte Schlüsselfehler.
Marc B

3
@MarcB Ich habe gerade getestet, und es hat tatsächlich die IDs für vorhandene Zeilen ab 1 eingefügt
Michael Berkowski

Antworten:


253

Eine ALTER TABLEAnweisung zum Hinzufügen der PRIMARY KEYSpalte funktioniert in meinen Tests ordnungsgemäß:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

In einer temporären Tabelle, die zu Testzwecken erstellt wurde, hat die obige Anweisung die AUTO_INCREMENT idSpalte erstellt und Auto-Inkrement-Werte für jede vorhandene Zeile in der Tabelle eingefügt, beginnend mit 1.


1
Ja, das war meine Erfahrung. Denken Sie nie daran, ein separates Skript ausführen zu müssen, um Auto_Increment-IDs zu füllen ...
Mike Purcell

1
lol Danke. mein Fehler. Die grüne Markierung ist für Sie, da Ihre dann einfacher zu implementieren ist. : D
FlyingCat

53
Um es zur ersten Spalte zu machen, verwenden Sie FIRSTzBALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
Die Mechanik von @Nikkie SQLite ist ganz anders. Vorschläge finden Sie hier stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma Wenn Sie die Zeile mit automatischer Inkrementierung erstellt haben und sie sofort anhand der ID abrufen müssen, bietet MySQL LAST_INSERT_ID()diesen Wert an, SELECT * FROM table_name WHERE id = LAST_INSERT_ID()und die meisten Programmiersprachen-APIs bieten eine Funktion / Methode, um diesen Wert im Anwendungscode zurückzugeben.
Michael Berkowski

51

Angenommen, Sie haben keine Spalte für die automatische Inkrementierung wie id, nein, dann können Sie diese mithilfe der folgenden Abfrage hinzufügen:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

Wenn Sie eine Spalte haben, ändern Sie diese mithilfe der folgenden Abfrage in die automatische Inkrementierung:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

1
Was macht das FIRSTam Ende?
Dementic

1
Dadurch wird die neue idSpalte zur ersten in der Tabelle und nicht zur letzten, was das Standardverhalten ist.
Fmalina

Gut arbeiten! Vielen Dank!
Majedur Rahaman

4

Ja, so etwas würde es tun, vielleicht ist es nicht das Beste, aber Sie möchten vielleicht ein Backup erstellen

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

Beachten Sie, dass die von any_fieldIhnen ausgewählte Option beim Aktualisieren identisch sein muss.


4

Für diejenigen wie mich, die einen Multiple primary key definedFehler bekommen, versuchen Sie:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

In MySQL v5.5.31 wurde die idSpalte als Primärschlüssel für mich festgelegt und jede Zeile mit einem inkrementierenden Wert gefüllt .


2

Am einfachsten und schnellsten finde ich das

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);

2

Ich konnte diese Anweisungen anpassen. Nehmen Sie eine Tabelle mit einem vorhandenen nicht inkrementellen Primärschlüssel, fügen Sie der Tabelle einen inkrementierenden Primärschlüssel hinzu und erstellen Sie einen neuen zusammengesetzten Primärschlüssel mit dem alten und dem neuen Schlüssel als zusammengesetzten Primärschlüssel Code:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

Wenn dies erledigt ist, existiert das Feld _USER_ID und enthält alle Zahlenwerte für den Primärschlüssel genau wie erwartet. Mit der "DROP TABLE" oben können Sie dies immer wieder ausführen, um mit Variationen zu experimentieren.

Was ich nicht zum Laufen bringen konnte, ist die Situation, in der eingehende AUSLÄNDISCHE SCHLÜSSEL vorhanden sind, die bereits auf das Feld USER_ID verweisen. Ich erhalte diese Meldung, wenn ich versuche, ein komplexeres Beispiel mit einem eingehenden Fremdschlüssel aus einer anderen Tabelle zu erstellen.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

Ich vermute, dass ich alle Fremdschlüssel abreißen muss, bevor ich die ALTER-Tabelle mache, und sie anschließend neu erstellen muss. Aber jetzt wollte ich diese Lösung mit einer herausfordernderen Version der ursprünglichen Frage teilen, falls andere in diese Situation geraten sollten.


0

Exportieren Sie Ihre Tabelle, leeren Sie Ihre Tabelle, fügen Sie das Feld als eindeutige INT hinzu, ändern Sie es in AUTO_INCREMENT und importieren Sie die zuvor exportierte Tabelle erneut.


0

Mit dem folgenden Befehl können Sie einer vorhandenen Tabelle, die Sequenznummern enthalten kann, eine neue Primärschlüsselspalte hinzufügen.

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

Ich hatte das gleiche Problem, also habe ich das Feld für den Primärschlüssel gelöscht, dann neu erstellt und sichergestellt, dass es automatisch inkrementell ist. Das hat bei mir funktioniert. Ich hoffe es hilft anderen


0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Hier ist tableName der Name Ihrer Tabelle,

tableName ist Ihr Spaltenname, der primär geändert werden muss

MEDIUMINT ist ein Datentyp Ihres vorhandenen Primärschlüssels

AUTO_INCREMENT Sie müssen nur auto_increment nach nicht null hinzufügen

Dadurch wird der Primärschlüssel automatisch_inkrementiert ......

Hoffe das ist hilfreich :)


1
Es wäre nützlich, wenn Sie eine Erklärung bearbeiten und hinzufügen.
Shashanth

-1

Wie schreibe ich PHP, um das bereits vorhandene Feld (Name, in diesem Beispiel) zu ändern, um es zu einem Primärschlüssel zu machen? Ohne zusätzliche 'ID'-Felder zur Tabelle hinzuzufügen.

Dies ist eine aktuell erstellte Tabelle - Anzahl der gefundenen Datensätze: 4 Name VARCHAR (20) JA Rasse VARCHAR (30) JA Farbe VARCHAR (20) JA Gewicht SMALLINT (7) JA

Dies ist ein angestrebtes Endergebnis (TABELLENBESCHREIBUNG) -

Anzahl der gefundenen Datensätze: 4 Name VARCHAR (20) KEINE PRI-Rasse VARCHAR (30) JA Farbe VARCHAR (20) JA Gewicht SMALLINT (7) JA

Anstatt dies zu bekommen -

Anzahl der gefundenen Datensätze: 5 id int (11) NO PRI name VARCHAR (20) JA Rasse VARCHAR (30) JA Farbe VARCHAR (20) JA Gewicht SMALLINT (7) JA

nach dem Versuch ..

$ query = "ALTER TABLE Rennpferde ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";

Wie bekomme ich das? - -

Anzahl der gefundenen Datensätze: 4 Name VARCHAR (20) KEINE PRI-Rasse VARCHAR (30) JA Farbe VARCHAR (20) JA Gewicht SMALLINT (7) JA

dh INSERT / ADD .. usw. der Primärschlüssel IN den ersten Felddatensatz (ohne Hinzufügen eines zusätzlichen 'id'-Feldes, wie zuvor angegeben.

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.