sql >> Database teknologi >  >> RDS >> Mysql

lav et ID i en mysql-tabel auto_increment (efter faktum)

For eksempel, her er en tabel, der har en primær nøgle, men ikke er AUTO_INCREMENT :

mysql> CREATE TABLE foo (
  id INT NOT NULL,
  PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
 

Du kan MODIFY kolonnen for at omdefinere den med AUTO_INCREMENT mulighed:

mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
 

Bekræft, at dette er trådt i kraft:

mysql> SHOW CREATE TABLE foo;
 

Udgange:

CREATE TABLE foo (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
 

Bemærk, at du har ændret kolonnedefinitionen på plads, uden at det er nødvendigt at oprette en anden kolonne og slette den oprindelige kolonne. PRIMARY KEY begrænsning er upåvirket, og du behøver ikke at nævne det i ALTER TABLE erklæring.

Dernæst kan du teste, at en insert genererer en ny værdi:

mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
 

Udgange:

+----+ | id | +----+ | 1 | | 2 | | 5 | | 6 | +----+ 4 rows in set (0.00 sec)

Jeg testede dette på MySQL 5.0.51 på Mac OS X.

Jeg testede også med ENGINE=InnoDB og en afhængig tabel. Ændring af id kolonnedefinition afbryder ikke referentiel integritet.

For at svare på fejlen 150, du nævnte i din kommentar, er det sandsynligvis en konflikt med begrænsningerne for fremmednøgle. Jeg beklager, efter at jeg havde testet det, troede jeg, at det ville virke. Her er et par links, der kan hjælpe med at diagnosticere problemet:



  1. Forbedre SQL INSERT-forespørgsel for at undgå sql-injektioner

  2. MySQL - Russiske tegn vises forkert

  3. Hvordan opretter man et unikt indeks på en NULL kolonne?

  4. Se om lat / lang falder inden for en polygon ved hjælp af mysql