Wstaw klucz podstawowy z automatycznym zwiększaniem wartości do istniejącej tabeli


157

Próbuję zmienić tabelę, która nie ma klucza podstawowego ani kolumny auto_increment. Wiem, jak dodać kolumnę klucza podstawowego, ale zastanawiałem się, czy możliwe jest automatyczne wstawianie danych do kolumny klucza podstawowego (mam już 500 wierszy w DB i chcę im nadać identyfikator, ale nie chcę tego robić ręcznie) . jakieś pomysły? Wielkie dzięki.


2
Możesz łatwo alter tabledodać klucz, ale MySQL nie wygeneruje identyfikatorów pól, które jeszcze ich nie mają. Będziesz musiał ręcznie zaktualizować istniejące pola, a następnie upewnić się, że nowy element auto_increment zaczyna się od właściwego przesunięcia - domyślnie wynosi „1”, a mimo to i tak skończysz z powielonymi błędami klucza.
Marc B

3
@MarcB Właśnie przetestowałem i faktycznie wstawiłem identyfikatory dla istniejących wierszy, zaczynając od 1
Michael Berkowski

Odpowiedzi:


253

ALTER TABLEWypowiedź dodając PRIMARY KEYkolumnę działa poprawnie w moich testów:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

W tabeli tymczasowej utworzonej do celów testowych powyższa instrukcja utworzyła plik AUTO_INCREMENT id kolumnę i wstawiła wartości autoinkrementacji dla każdego istniejącego wiersza w tabeli, zaczynając od 1.


1
Tak, to było moje doświadczenie. Nigdy nie pamiętam, że musiałem uruchamiać osobny skrypt w celu wypełnienia identyfikatorów auto_increment ...
Mike Purcell

1
lol dzięki. mój błąd. Zielony znak jest dla Ciebie, ponieważ Twój jest wtedy łatwiejszy do wdrożenia. : D
FlyingCat

53
Aby uczynić go pierwszą kolumną, użyj FIRSTnp.ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas,

1
Mechanika @Nikkie SQLite jest zupełnie inna. Znajdziesz tutaj sugestie stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma Jeśli utworzyłeś wiersz z automatyczną inkrementacją i musisz go natychmiast pobrać według identyfikatora, MySQL oferuje LAST_INSERT_ID()tę wartość, SELECT * FROM table_name WHERE id = LAST_INSERT_ID()a większość interfejsów API języka programowania oferuje pewne funkcje / metody zwracania tej wartości w kodzie aplikacji.
Michael Berkowski

51

załóżmy, że nie masz kolumny do automatycznego zwiększania wartości, takiej jak id, nie, możesz dodać za pomocą następującego zapytania:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

Jeśli masz kolumnę, zmień na automatyczne zwiększanie za pomocą następującego zapytania:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

1
Co robi FIRSTna końcu?
Dementic

1
Dzięki temu nowa idkolumna będzie pierwszą w tabeli, a nie ostatnią, co jest zachowaniem domyślnym.
fmalina

Działa dobrze! Dzięki!
Majedur Rahaman

4

tak, coś takiego by to zrobiło, chociaż może nie być najlepsze, możesz zrobić kopię zapasową

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

Zwróć uwagę, any_fieldże wybrana opcja musi być taka sama podczas aktualizacji.


4

Dla takich, jak ja, pojawia się Multiple primary key definedbłąd:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

W MySQL w wersji 5.5.31 ustawiło to idkolumnę jako klucz podstawowy i zapełniło każdy wiersz wartością rosnącą .


2

Najłatwiejszy i najszybszy, jaki znajdę, to to

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);

2

Udało mi się dostosować te instrukcje, wziąć tabelę z istniejącym nieinkrementalnym kluczem podstawowym i dodać do tabeli zwiększający się klucz podstawowy i utworzyć nowy złożony klucz podstawowy ze starym i nowym kluczem jako złożonym kluczem podstawowym, używając następującego kod:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

Po wykonaniu tej czynności pole _USER_ID istnieje i zawiera wszystkie wartości liczbowe klucza podstawowego dokładnie tak, jak można się spodziewać. Dzięki „DROP TABLE” u góry możesz to wielokrotnie powtarzać, aby eksperymentować z odmianami.

To, czego nie udało mi się uzyskać, to sytuacja, w której przychodzące KLUCZE OBCE, które już wskazują na pole USER_ID. Otrzymuję ten komunikat, gdy próbuję wykonać bardziej złożony przykład z przychodzącym kluczem obcym z innej tabeli.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

Zgaduję, że muszę zerwać wszystkie klucze obce przed wykonaniem tabeli ALTER, a następnie odbudować je później. Ale na razie chciałem podzielić się tym rozwiązaniem z trudniejszą wersją pierwotnego pytania na wypadek, gdyby inni napotkali taką sytuację.


0

Wyeksportuj tabelę, opróżnij tabelę, dodaj pole jako unikalne INT, a następnie zmień je na AUTO_INCREMENT, a następnie zaimportuj ponownie tabelę, którą wyeksportowałeś wcześniej.


0

Możesz dodać nową kolumnę klucza podstawowego do istniejącej tabeli, która może mieć kolejne numery, używając polecenia:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

Miałem ten sam problem, więc porzuciłem pole klucza podstawowego, a następnie utworzyłem go ponownie i upewniłem się, że jest automatycznie przyrostowy. To zadziałało dla mnie. Mam nadzieję, że pomaga innym


0

ALTER TABLE tableName AKTUALIZACJA tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Tutaj tableName to nazwa twojego stołu,

nazwa_tabeli to nazwa kolumny, która jest podstawowa, którą należy zmodyfikować

ŚREDNI to typ danych istniejącego klucza podstawowego

AUTO_INCREMENT musisz dodać tylko auto_increment po nie null

Spowoduje to, że klucz podstawowy będzie automatycznie_increment ......

Mam nadzieję, że to jest pomocne :)


1
Byłoby przydatne, gdybyś edytować i dodać wyjaśnienie.
Shashanth

-1

Jak napisać PHP, aby ZMIENIĆ już istniejące pole (w tym przykładzie nazwę), aby stało się kluczem podstawowym? Oczywiście bez dodawania dodatkowych pól „id” do tabeli.

To jest aktualnie utworzona tabela - Liczba znalezionych rekordów: 4 nazwa VARCHAR (20) TAK rasa VARCHAR (30) TAK kolor VARCHAR (20) TAK waga SMALLINT (7) TAK

To jest oczekiwany rezultat końcowy (OPIS TABELI) -

Liczba znalezionych rekordów: 4 nazwa VARCHAR (20) NIE PRI rasa VARCHAR (30) TAK kolor VARCHAR (20) TAK waga SMALLINT (7) TAK

Zamiast tego -

Liczba znalezionych rekordów: 5 id int (11) NIE nazwa PRI VARCHAR (20) TAK rasa VARCHAR (30) TAK kolor VARCHAR (20) TAK waga SMALLINT (7) TAK

po wypróbowaniu ...

$ query = "ZMIEŃ TABELĘ konie wyścigowe DODAJ ID INT NIE NULL PIERWSZY AUTO_INCREMENT, DODAJ PODSTAWOWY KLUCZ (id)";

jak to zdobyć? -

Liczba znalezionych rekordów: 4 nazwa VARCHAR (20) NIE PRI rasa VARCHAR (30) TAK kolor VARCHAR (20) TAK waga SMALLINT (7) TAK

tj. WSTAW / DODAJ ... itd. klucz podstawowy DO pierwszego rekordu pola (bez dodawania dodatkowego pola „id”, jak wspomniano wcześniej.

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.