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.