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.

Jak mogę sprawić, że nid zacznie od 1?

gilzero
źródło
6
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.

Luis
źródło
1
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.
kiamlaluno
16
ALTER TABLE `node` AUTO_INCREMENT = 1;

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.

Dipen
źródło
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.

Beeleg
źródło
2

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.

drush delete-all --reset

Drupal 8

Spójrz tutaj

Usuwa całą zawartość wszystkich typów.

drush delete-all-delete-content

I wtedy:

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;
schneidolf
źródło
0

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ć

ALTER TABLE  `node` AUTO_INCREMENT=1
shahab
źródło
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ć.
Mołot