sql >> Databáze >  >> RDS >> Mysql

vytvořit ID v mysql tabulce auto_increment (po skutečnosti)

Zde je například tabulka, která má primární klíč, ale není AUTO_INCREMENT :

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

Můžete MODIFY sloupec a předefinujte jej pomocí AUTO_INCREMENT možnost:

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

Ověřte, že se to projevilo:

mysql> SHOW CREATE TABLE foo;

Výstupy:

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

Všimněte si, že jste upravili definici sloupce na místě, aniž byste museli vytvořit druhý sloupec a původní sloupec vypustit. PRIMARY KEY omezení není ovlivněno a nemusíte je uvádět v ALTER TABLE prohlášení.

Dále můžete otestovat, že vložka generuje novou hodnotu:

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

Výstupy:

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

Testoval jsem to na MySQL 5.0.51 na Mac OS X.

Také jsem testoval s ENGINE=InnoDB a závislá tabulka. Úprava id definice sloupce nenarušuje referenční integritu.

Chcete-li reagovat na chybu 150, kterou jste zmínili ve svém komentáři, je to pravděpodobně konflikt s omezeními cizího klíče. Omlouvám se, po vyzkoušení jsem si myslel, že to bude fungovat. Zde je několik odkazů, které mohou pomoci diagnostikovat problém:



  1. SQL získat další řádky z agregační funkce

  2. Json zakóduje celou sadu výsledků mysql

  3. sqlite:jak přidat celkový čas hh:mm:ss, kde je datový typ sloupce DATETIME?

  4. Existuje nějaký způsob, jak vložit velkou hodnotu do databáze mysql bez změny max_allowed_packet?