Po usunięciu wszystkich węzłów, jak zresetować identyfikator węzła, aby ponownie zacząć od 1?
17
Wygenerowałem mnóstwo atrapy zawartości do testów, a następnie usunąłem je wszystkie. Ponieważ nid jest auto-przyrostem, nowo utworzony węzeł będzie miał nid ostatnio utworzonego nid +1.
Pytanie brzmi: dlaczego miałby to zrobić. Tak naprawdę nie ma znaczenia, jaki nid jest używany, i nie ma gwarancji, że i tak zawsze jest ściśle sekwencyjny.
Berdir
3
Zgadzam się z Berdirem; żaden moduł nie powinien polegać na tym, że pierwszy węzeł ma identyfikator równy 1. Jest to podobnie do identyfikatora użytkownika: możesz polegać na obecności użytkownika o identyfikatorze równym 0 i 1, które są zawsze tworzone z Drupala podczas instalacji, ale nie należy polegać na obecności konta użytkownika o identyfikatorze równym 3. Inne moduły mogłyby usunąć konto anonimowego użytkownika lub superużytkownika, ale należy to uznać za błąd takich modułów.
kiamlaluno
Odpowiedzi:
13
Po prostu nie obcinaj tabeli węzłów w ten sposób, istnieje kilka innych tabel podłączonych do tabeli węzłów, takich jak wersje_węzłów, sekwencje, tabele pól, tabele taksonomii i wiele innych.
Nie ma bezpiecznego sposobu, aby to zrobić, to naprawdę zależy od Twojej witryny, musisz obciąć i dostosować wszystkie tabele, które mają nid, w tym tabelę sekwencji. Pamiętaj, że jest bardzo prawdopodobne, że Twoja witryna stanie się bezużyteczna, więc nie zaczynaj bez kopii zapasowej.
Spodziewałbym się, że inne tabele zawierające odniesienia do węzłów również powinny być puste po usunięciu wszystkich węzłów. Powiedział, że żaden moduł nie powinien polegać na fakcie, że pierwszy węzeł ma identyfikator równy 1.
Czasami w projektach migracyjnych podczas migracji z innych platform (np. ASP + MSSQL), czasami nie można zresetować NID z powodu wielu czynników. Jestem pewien, że można tego uniknąć, ale kompromis czas / kod zawsze istnieje.
Przeszedłem przez ogromny projekt migracji, który trwał miesiące. Witryna, z której korzystałem do programowania i testowania, dodała tu i ówdzie nowe węzły, które zawierają niektóre z najnowszych treści. Myślę, że musisz wycofać wszystkie węzły i komentarze i ustawić AUTO_INCREMENT = 1 dla obu. Zastanawiam się, czy ktoś, kto zrobił to w przypadku migracji, napotkał jakieś inne problemy, szczególnie w przypadku Drupala 7?
Webdrips
2
Zapytanie SQL: ALTER TABLE 'node' AUTO_INCREMENT=1;
Zanim to zrobisz, upewnij się, że usunąłeś wszystkie węzły.
ALTER TABLE `node` AUTO_INCREMENT=1;
ALTER TABLE `node_revision` AUTO_INCREMENT=1;
ALTER TABLE `node_field_data` AUTO_INCREMENT=1;
ALTER TABLE `node_field_revision` AUTO_INCREMENT=1;
Obcięcie tabeli węzłów zignoruje wszystkie haki, które powinny zostać uruchomione podczas usuwania węzła, więc nie jest to mądry pomysł. Na przykład, pozostawi dane w tabeli wersji, a Drupal zawiesi się, gdy uderzy w już używany identyfikator nid próbujący utworzyć wersję.
Mołot
@ Mołot, jeśli obetniesz węzeł i poprawisz tabelę węzłów, nie masz żadnych problemów.
Testuję
Fakt, że w konkretnej konfiguracji ta metoda się powiodła, nie dowodzi, że zawsze będzie działać.
Odpowiedzi:
Po prostu nie obcinaj tabeli węzłów w ten sposób, istnieje kilka innych tabel podłączonych do tabeli węzłów, takich jak wersje_węzłów, sekwencje, tabele pól, tabele taksonomii i wiele innych.
Nie ma bezpiecznego sposobu, aby to zrobić, to naprawdę zależy od Twojej witryny, musisz obciąć i dostosować wszystkie tabele, które mają nid, w tym tabelę sekwencji. Pamiętaj, że jest bardzo prawdopodobne, że Twoja witryna stanie się bezużyteczna, więc nie zaczynaj bez kopii zapasowej.
źródło
PS - Inni, którzy odpowiedzieli na to pytanie: Właśnie usunąłem drobną kontrolę po usunięciu treści i powiązana treść jest rzeczywiście usuwana, tabele_węzłów i tabele_pole * są puste. node_delete mówi to samo - http://api.drupal.org/api/drupal/modules--node--node.module/function/node_delete_multiple/7
Czasami w projektach migracyjnych podczas migracji z innych platform (np. ASP + MSSQL), czasami nie można zresetować NID z powodu wielu czynników. Jestem pewien, że można tego uniknąć, ale kompromis czas / kod zawsze istnieje.
źródło
Zapytanie SQL:
ALTER TABLE 'node' AUTO_INCREMENT=1;
Zanim to zrobisz, upewnij się, że usunąłeś wszystkie węzły.
źródło
Możesz użyć modułu Usuń wszystko, używając następujących poleceń drush:
Drupal 7
Usuń węzły wszystkich typów i zresetuj liczniki węzłów, wersji i komentarzy.
Drupal 8
Spójrz tutaj
Usuwa całą zawartość wszystkich typów.
I wtedy:
źródło
możesz obciąć tabelę węzłów, ale zwróć uwagę, że musisz obciąć relacyjną tabelę pól, jeśli chcesz po prostu rozpocząć inkrementację od 1, możesz użyć
źródło