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


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;

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;

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.


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



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


0

Spróbuj tego,

alter table goods add column `id` int(10) unsigned primary key auto_increment

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


-3

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

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.