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 '
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:
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.
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;
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;
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.
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.
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