2012-04-06 14 views
5

Mam serwer MySQL 5 i tabelę w nim z autoinkrementem w polu id (klucz podstawowy). Teraz chcę dodać rekord pomiędzy i dlatego muszę zwiększyć wszystkie inne identyfikatory o jeden. Oto, co próbowałem:Przyrostowe pole id autoinkrecji o jeden

UPDATE myTable SET id=id+1 WHERE id >= 53 

To nie działa, ponieważ na przykład rekord o identyfikatorze = 52 już istnieje. Jak mogę to zrobić? Jeśli zacznie od ostatniego wpisu i będzie aktualizował, powinien działać. Ale jak?

+3

Podstawowym ma na celu zapewnienie tożsamości * dla wiersza, a nie kolejność * * je. Użyj oddzielnej kolumny, aby określić żądane zamówienie. Zmiana klucza podstawowego dla wiersza po wstawieniu go spowoduje tylko problemy. –

+1

co zrobić, jeśli upuścić i ponownie utworzyć pole autoreklama? –

+2

Upuszczenie i ponowne utworzenie kolumny (lub próba zmiany numeracji istniejących wierszy) nie będzie działać, szczególnie jeśli już użyłeś identyfikatorów jako klucza obcego. (Przerywa połączenia z istniejącymi wierszami.) Naprawdę powinieneś słuchać @MarkByers - "Zmiana klucza podstawowego dla wiersza po wstawieniu go spowoduje tylko problemy." Zobacz także [to] (http://stackoverflow.com/questions/2106237/is-there-any-harm-in-resetting-the-auto-increment) Pytanie i odpowiedzi. –

Odpowiedz

11

widzę żadnego powodu do tego. Same problemy. Przed uruchomieniem poniższej instrukcji sprawdź, czy masz zdefiniowane klucze FOREIGN, które odnoszą się do tego id. Czy są ustawione na ON UPDATE CASCADE? Masz również jakieś wyzwalacze powiązane z tą tabelą?

Ale najpierw rozważ, , dlaczego ty (myślę) potrzebujesz tego. Czy będzie on używany do zamawiania stołu? W takim przypadku, jak zaznaczył @Mark, powinieneś użyć oddzielnej kolumny, aby określić żądane zamówienie.


Jeśli jednak zdecydujesz, że naprawdę chcesz tego używać:

UPDATE myTable 
SET id = id + 1 
WHERE id >= 53 
ORDER BY id DESC ; 
+0

Nie używam go do zamawiania. Czy istnieje szybki sposób na sprawdzenie kluczy obcych za pomocą przeglądarki zapytań MySQL? To samo dla wyzwalaczy ... – testing

+0

Aby sprawdzić, czy istnieją FKs ** z ** tej tabeli do innych tabel, po prostu użyj 'POKAŻ CREATE TABLE myTable'. Aby dowiedzieć się, czy istnieją FKs ** do ** tej tabeli od innych, będziesz musiał użyć bazy danych 'information_schema'. –

+1

[Zapytanie w celu znalezienia kluczy obcych] (http://stackoverflow.com/questions/7765820/query-to-find-foreign-keys) –

0

Chyba coś takiego działa:

UPDATE myTable SET id=id+1 WHERE id >= (select id from myTable order by id DESC) 
+0

@Ken: Pomimo nazwy "auto _...", możesz przypisać wartość, jeśli nie chcesz mieć domyślnej wartości auto_incremented. –

+0

@ypercube: Yuk. I dzięki za informację :). Jeszcze jeden powód, by nie używać MySQL (w każdym razie). Usuwam mój komentarz powyżej. –

+0

AFAIK, to samo dotyczy kolumn Identity w SQL-Server. Ale zwyczajowym zachowaniem jest oczywiście nie wpisywanie wartości ręcznie. –

0

miałem do czynienia tego samego problemu. Próbowano również z zapytaniem OP i @Romain Hoog. Ale nie udało się.

W końcu wyeksportował dane z całej tabeli w programie Excel i zrobił to w programie Excel (nie jeden po drugim, ale za pomocą sztuczki, która czyni go bardzo szybko).

Następnie wykonano kopię zapasową oryginalnej tabeli, odtworzono nową tabelę i zaimportowano dane ze zaktualizowanego programu Excel.

+0

Co zrobiłeś w Excelu? Po prostu + 1 jako formuła? Myślałem o wyeksportowaniu pliku CSV, a następnie edytowaniu danych tutaj. Później z 'LOAD DATA INFILE" data.csv "zamień na tabelkę myTable ..." Mogłem zaimportować dane. Jak to zrobiłeś? – testing

+0

wykonane za pomocą przeciągnięcia + znak. Zaimportowałem dane za pomocą narzędzia interfejsu użytkownika, a nie za pomocą danych LOAD. Ale możesz zrobić z tym również. –

+0

Z jakiego narzędzia interfejsu użytkownika korzystałeś? – testing

4

Szybko i brudno robisz to w 2 krokach.

  • wzrost identyfikator z numerem wyższym że wszyscy inni
  • spadek wszystkie identyfikatory do żądanego numeru

Jak ten

UPDATE myTable SET id=id+10000 WHERE id >= 53 
UPDATE myTable SET id=id-9999 WHERE id >= 53 
Powiązane problemy