2010-01-18 16 views
7

Mam tabelę z wieloma wierszami, ale są one nieczynne. Im przy użyciu pola "id" jako klucz podstawowy. Mam również pole "date", które jest polem datetime.jak ponownie wyświetlić tabelę mysql

Jak mogłem reindex tabelę tak, że wpisy są Zidentyfikowaliśmy w porządku chronologicznym, zgodnie z pola daty

+5

Oczekiwanie, że wiersze są * przechowywane * w określonej kolejności w dowolnej relacyjnej bazie danych, prawdopodobnie nie jest dobrym pomysłem. Do tego służą indeksy i ORDER BY. Identyfikatory to tylko identyfikatory; jeśli ważny jest według daty/czasu, kogo obchodzą identyfikatory? – Joe

Odpowiedz

8

sposób w jaki zrobiłby to, aby utworzyć nową tabelę z indeksem auto inkrementacji i po prostu zaznacz wszystko twój stary stół do tego porządku według daty. możesz wtedy usunąć swój stary stół.

6

Poniższy fragment kodu SQL powinien zrobić to, co chcesz.

ALTER TABLE test_table ADD COLUMN id2 int unsigned not null; 
SET @a:=0; 
UPDATE test_table SET [email protected]:[email protected]+1 ORDER BY `date`; 
ALTER TABLE test_table DROP id; 
ALTER TABLE test_table CHANGE id2 id int UNSIGNED NOT NULL AUTO_INCREMENT, 
    ADD PRIMARY KEY (id); 

Należy pamiętać, że nigdy nie można zagwarantować porządek kolumny auto-zwiększany po uruchomieniu wkładania i wyjmowania dane, więc nie należy polegać na dowolnej kolejności, z wyjątkiem tego, co można określić za pomocą ORDER BY w swojej zapytania. Jest to kosztowna operacja, która wymaga pełnej indeksacji indeksów, więc nie sugerowałbym jej zbyt często.

9

Dlaczego chcesz, aby sekwencja identyfikatorów korelowała z datami? Wygląda na to, że chcesz wykonać ORDER BY id i przywrócić wiersze w porządku chronologicznym. Jeśli chcesz wiersze w kolejności, użyj zamiast tego ORDER BY date.

Wartości w kolumnie ID autoinkrecji należy traktować jako arbitralne. Poleganie na tym, że twoje identyfikatory są w porządku, jest złym pomysłem.

2

Możesz użyć ALTER TABLE t ORDER BY col; Dozwolona składnia polecenia ORDER BY jest taka, jak w instrukcjach SELECT.

8

Jak o czymś w rodzaju prostej kwerendy przy użyciu zmiennej:

set @ROW = 0; 
UPDATE `tbl_example` SET `id` = @ROW := @ROW+1 ORDER BY `fld_date` ASC; 

To będzie zamówić wiersze jak: 0,1,2,4,5 ... etc datą.

+0

Nie spowoduje to zresetowania licznika automatycznej inkrementacji –

+0

Musiałem zmienić ten pierwszy wiersz na 'set @ROW = 0;', a następnie zadziałało –

0

Musiałem zrobić coś podobnego. Najlepszym sposobem, aby to zrobić był następujący (można go uruchomić w jednym zapytaniu SQL, jeśli chcesz, ale miej na uwadze, że jest to zasób czasochłonne działanie powolne i bardzo):

aby upewnić A BACKUP TWOJEGO TABELI, W TYM STRUKTURA I DANE PRZED ROZPOCZĘCIEM TEGO ZADANIA!

ALTER TABLE your_table ADD COLUMN temp_id INT UNSIGNED NOT NULL; 
SET @a:=0; 
UPDATE your_table SET [email protected]:[email protected]+1 ORDER BY `date` ASC; 
ALTER TABLE your_table DROP id; 
ALTER TABLE your_table CHANGE temp_id id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id); 
ALTER TABLE your_table CHANGE COLUMN id id INT(10) FIRST; 

Tylko nie zapomnij zmienić „your_table” z nazwą tabeli, a kolejność kolumn. Tu wyjaśnię ci, co robisz ten sposób krok po kroku:

  1. Najpierw trzeba dodać nową kolumnę o nazwie „temp_id” (upewnić się, że nie jest to nazwa używasz już);
  2. Następnie dodajemy zmienną tymczasową równą 0 (lub dowolne, czego chcemy, aby identyfikator zaczynał się od);
  3. Następnie aktualizujesz tabelę, wiersz po wierszu według ustawionej logiki ZAMÓWIENIA, ustawiając wartość dla nowej kolumny "temp_id" równą ustawionej zmiennej, a następnie zwiększ tę zmienną o 1 (możesz zrobić coś ciekawego tutaj, na przykład, jeśli chcesz, aby twoje identyfikatory były zawsze równe, możesz ustawić @ a + 2);
  4. Kolejny krok upuścisz (usuniesz) swój stary identyfikator kolumny;
  5. Następnie zmieniasz nazwę swojej kolumny temp_id z powrotem na ID, a jako dodatnią liczbę całkowitą z automatycznym inkrementowaniem, który jest kluczem podstawowym twojej tabeli.
  6. Ponieważ ID jest teraz nowo dodaną kolumną temp_id, znajduje się na końcu struktury tabeli. Aby przenieść go ponownie jako pierwszą kolumnę, uruchom ostatnie zapytanie, aby upewnić się, że jest to pierwsza kolumna.
Powiązane problemy