Oto, czego próbowałem, ale się nie udaje:
alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;
Czy ktoś ma wskazówkę?
Oto, czego próbowałem, ale się nie udaje:
alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;
Czy ktoś ma wskazówkę?
Odpowiedzi:
Po dodaniu kolumny zawsze możesz dodać klucz podstawowy:
ALTER TABLE goods ADD PRIMARY KEY(id)
Aby dowiedzieć się, dlaczego Twój skrypt nie działał, musisz określić PRIMARY KEY, a nie tylko słowo PRIMARY:
alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
FIRSTpo AUTO_INCREMENT, co oznacza, że idbędzie to pierwsza kolumna istniejącej już tabeli. W przeciwnym razie zostanie on umieszczony na końcu tabeli, tak jak jest teraz napisane, co może być trochę zagmatwane, gdy robimy prosteSELECT * ...
Jeśli chcesz dodać ograniczenie klucza podstawowego do istniejącej kolumny, wszystkie poprzednio wymienione składnie zawiodą.
Aby dodać ograniczenie klucza podstawowego do istniejącej kolumny, użyj formularza:
ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
Jeśli twój stół jest dość duży, lepiej nie używaj stwierdzenia:
alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
ponieważ tworzy kopię wszystkich danych w tabeli tymczasowej, zmienia tabelę, a następnie kopiuje ją z powrotem. Lepiej zrób to ręcznie. Zmień nazwę stołu:
rename table goods to goods_old;
utwórz nową tabelę z kluczem podstawowym i wszystkimi niezbędnymi indeksami:
create table goods (
id int(10) unsigned not null AUTO_INCREMENT
... other columns ...
primary key (id)
);
przenieś wszystkie dane ze starej tabeli do nowej, wyłączając klucze i indeksy, aby przyspieszyć kopiowanie:
- UŻYJ TEGO DO TABEL MyISAM :
SET UNIQUE_CHECKS=0;
ALTER TABLE goods DISABLE KEYS;
INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old;
ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;
- UŻYJ TEGO DO STOŁÓW InnoDB :
SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old;
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;
Dodanie PK do tabeli zawierającej ~ 200 mln wierszy zajmuje 2000 sekund.
Nie jestem pewien, czy to ma znaczenie dla kogokolwiek innego, ale wolę tabelę identyfikatorów od pierwszej kolumny w bazie danych. Składnia tego jest następująca:
ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;
To tylko niewielka poprawa w stosunku do pierwszej odpowiedzi. Gdybyś chciał, żeby był w innej pozycji, to
ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;
HTH, -ft
Użyj tego zapytania,
alter table `table_name` add primary key(`column_name`);
Ten kod działa w mojej bazie danych mysql:
ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Spróbuj tego,
alter table goods add column `id` int(10) unsigned primary key auto_increment
Dla mnie żadna z sugestii nie zadziałała, dając mi błędy składni, więc po prostu spróbowałem użyć phpmyadmin (wersja 4.9.2), (10.4.10-MariaDB) i dodałem idkolumnę z kluczem podstawowym z automatycznym zwiększaniem wartości. Idkolumna została ładnie dodana od pierwszego elementu.
Wynik zapytania:
ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);
Usuń cudzysłowy, aby działały poprawnie ...
alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;