zrobić ID w tabeli mysql auto increment (po fakcie)

Nabyłem bazę danych od innego dewelopera. Nie używał auto_incrementers na żadnych tabelach. Wszystkie mają identyfikator klucza głównego, ale on robił wszystko ręcznie, w kodzie.

Czy mogę teraz zamienić je w Auto_incrementery?


Wow, bardzo ładne, Wielkie dzięki. Na jednym z moich stołów zadziałało bez zarzutu. Ale drugi stolik, dostaję ten błąd...Błąd przy zmianie nazwy '.\DBNAME#sql-6c8_62259c' to'.\DBNAME\dealer_master_events '

Author: casperOne, 2008-10-30

6 answers

Na przykład, oto tabela, która ma klucz podstawowy, ale nie jest AUTO_INCREMENT:

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

Możesz MODIFY kolumnę przedefiniować za pomocą opcji AUTO_INCREMENT:

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

Zweryfikuj to:

mysql> SHOW CREATE TABLE foo;

Wyjścia:

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

Zauważ, że zmodyfikowano definicję kolumny, bez konieczności tworzenia drugiej kolumny i upuszczania oryginalnej kolumny. Nie ma to wpływu na ograniczenie PRIMARY KEY i nie musisz o nim wspominać w ALTER TABLE oświadczenie.

Następnie możesz sprawdzić, czy insert generuje nową wartość:

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

Wyjścia:

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

Testowałem to na MySQL 5.0.51 na Mac OS X.

Testowałem również z ENGINE=InnoDB i tabelą zależną. Modyfikacja definicji kolumny id nie zakłóca integralności odniesienia.


Aby odpowiedzieć na błąd 150, o którym wspomniałeś w komentarzu, prawdopodobnie jest to konflikt z ograniczeniami klucza obcego. Przepraszam, po przetestowaniu pomyślałem to by zadziałało. Oto kilka linków, które mogą pomóc w zdiagnozowaniu problemu:

 99
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:19

Zgaduję, że nie musisz ponownie zwiększać istniejących danych, więc dlaczego nie możesz po prostu uruchomić prostego polecenia ALTER TABLE, aby zmienić atrybuty PK?

Coś w stylu:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 

Przetestowałem ten kod na własnej bazie danych MySQL i działa, ale nie próbowałem go z żadną znaczącą liczbą rekordów. Po zmianie wiersza musisz zresetować przyrost do liczby gwarantowanej, aby nie kolidował z innymi rekordami.

ALTER TABLE `content` auto_increment = MAX(`id`) + 1

Znowu nieprzetestowane, ale ja wierzę, że to zadziała.

 4
Author: Stephen Walcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 20:11:19

Żadne z powyższych nie zadziałało na mój stół. Mam tabelę z unsigned integer jako klucz podstawowy z wartościami od 0 do 31543. Obecnie istnieje ponad 19 tysięcy rekordów. Musiałem zmodyfikować kolumnę do AUTO_INCREMENT (MODIFY COLUMN'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) i ustawić seed (AUTO_INCREMENT = 31544) w tej samej instrukcji.

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
 4
Author: Michael A. Griffey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 17:35:30

To działało dla mnie (chciałem zrobić ID primary i ustawić auto increment)

ZMIEŃ TABELĘ table_name ZMIEŃ id id INT KLUCZ GŁÓWNY AUTO_INCREMENT;

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 21:34:00

Tak, spokojnie. Po prostu uruchom Zapytanie o definicję danych, aby zaktualizować tabele, dodając kolumnę AUTO_INCREMENT.

Jeśli masz istniejącą bazę danych, zachowaj wszelkie relacje z kluczami obcymi, które mogą już istnieć w "sztucznie utworzonych" kluczach podstawowych.

 0
Author: Alex Weinstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 19:55:38

Tak długo, jak masz unikalne liczby całkowite (lub jakąś unikalną wartość) w bieżącym PK, możesz utworzyć nową tabelę i wstawić do niej z włączoną wstawką tożsamości. Następnie upuść starą tabelę i zmień jej nazwę.

Nie zapomnij odtworzyć żadnych indeksów.

 -1
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 19:54:40