Jak dodać klucz podstawowy do tabeli MySQL?

104

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ę?

mysql_go
źródło
11
Kiedy coś się nie powiedzie , to zawsze dobry pomysł, aby określić, co nie oznacza: pojawi się komunikat o błędzie? Który ?
Pascal MARTIN
Wygląda na to, że komunikat o błędzie wygląda następująco: zdefiniowano wiele kluczy podstawowych
LMD.

Odpowiedzi:

227

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;
Scrum Meister
źródło
Dla mnie mówi: to zdefiniowałoby wiele kluczy podstawowych. Używam InnoDB. Uwaga, mam już 3 z nich.
LMD
2
Zdecydowanie postawiłbym 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 * ...
StefanK
Jak zdobyć pierwsze miejsce w nowej kolumnie „id”
TipVisor
17

Istniejąca kolumna

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;
MER
źródło
1
mysql nie rozpoznaje MODIFY jako właściwej instrukcji (przynajmniej w XAMPP, InnoDB)
LMD
@LMD Z jakiej wersji mysql korzystasz? (UWAGA: wiem, że to działało w momencie, gdy to opublikowałem i wydaje mi się, że było to 5,6 ... ale nie pamiętam na pewno)
MER
1
Jeśli u Ciebie tak jak u mnie to nie zadziała zamień MODIFY na CHANGE i będzie działać!
csr-nontol
12

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;

LUB

- 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.

Denis Makarskiy
źródło
Byłem zaskoczony, jak długo musiałem szukać, aby znaleźć tę odpowiedź. Dzięki za te pomocne przykłady.
Ryan
4

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

ftrotter
źródło
3

Użyj tego zapytania,

alter table `table_name` add primary key(`column_name`);
RATAN KUMAR
źródło
2

Ten kod działa w mojej bazie danych mysql:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
Michał Myszor
źródło
1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Vimit Patel
źródło
0

Spróbuj tego,

alter table goods add column `id` int(10) unsigned primary key auto_increment
phponwebsites
źródło
0

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);

av3000
źródło
-3

Usuń cudzysłowy, aby działały poprawnie ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Raja Muthukutty
źródło