После удаления всех узлов, как мне сбросить идентификатор узла, чтобы начать с 1 снова?


17

Я создал тонны фиктивного контента для тестирования, а затем удалил их все. Поскольку nid - автоинкремент, у вновь созданного узла будет nid последнего созданного nid +1.

Как я могу сделать nid начать с 1 снова?


6
Вопрос в том, зачем это делать. Неважно, какой nid используется, и нет никакой гарантии, что он всегда будет строго последовательным.
Бердир

3
Я согласен с Бердиром; ни один модуль не должен полагаться на тот факт, что первый узел имеет идентификатор, равный 1. Это аналогично идентификатору пользователя пользователей: вы можете полагаться на присутствие пользователя с идентификаторами, равными 0 и 1, которые всегда создаются из Drupal. во время установки, но не следует полагаться на наличие учетной записи пользователя с идентификатором, равным 3. Другие модули могут удалить учетную запись анонимного пользователя или суперпользователя, но это следует считать ошибкой таких модулей.
kiamlaluno

Ответы:


13

Plase не усекает таблицу узлов просто так, есть некоторые другие таблицы, связанные с таблицей узлов, такие как node_revisions, последовательности, таблицы полей, таблицы таксономии и многое другое.

Безопасного способа сделать это не существует, это действительно зависит от вашего сайта, вам придется усекать и корректировать все таблицы, в которых есть nid, включая таблицу последовательностей. Помните, что весьма вероятно, что ваш сайт станет непригодным для использования, поэтому не запускайте сначала без резервной копии.


1
Я ожидаю, что другие таблицы, содержащие ссылки на узлы, также должны быть пустыми, когда все узлы будут удалены. Сказал, что ни один модуль не должен полагаться на тот факт, что первый узел имеет идентификатор, равный 1.
kiamlaluno

16
ALTER TABLE `node` AUTO_INCREMENT = 1;

PS - Другие, кто ответил на этот вопрос: я только что сделал небольшую проверку после удаления контента, и связанный контент действительно удален, таблицы node_revisions и field_ * пусты. node_delete говорит то же самое - http://api.drupal.org/api/drupal/modules--node--node.module/function/node_delete_multiple/7

Иногда в проектах миграции, когда вы переходите с других платформ (например, ASP + MSSQL), иногда становится неизбежным сбросить nid из-за множества факторов. Я уверен, что этого можно избежать, но компромисс между временем и кодом всегда есть.


Я проходил масштабный миграционный проект, который занимал месяцы. На сайте, который я использовал для разработки и тестирования, были добавлены некоторые новые узлы, которые содержат некоторые из более свежего контента. Я думаю, вам нужно откатить все узлы и комментарии и установить AUTO_INCREMENT = 1 для обоих. Мне интересно, сталкивался ли кто-нибудь, кто сделал это для миграции, с какими-либо другими проблемами, особенно с Drupal 7?
Webdrips

2

SQL-запрос: ALTER TABLE 'node' AUTO_INCREMENT=1;

Убедитесь, что вы удалили все узлы, прежде чем делать это.


2

Вы можете использовать модуль Delete all со следующими командами drush:

Drupal 7

Удалите узлы всех типов и сбросьте счетчики узлов, ревизий и комментариев.

drush delete-all --reset

Drupal 8

посмотреть здесь

Удаляет весь контент всех типов.

drush delete-all-delete-content

А потом:

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;

0

Вы можете усечь таблицу узлов, но обратите внимание, что вы должны усекать таблицу реляционных полей, если вы просто хотите начать увеличение идентификатора с 1, вы можете использовать

ALTER TABLE  `node` AUTO_INCREMENT=1

Усеченная таблица узлов будет игнорировать все ловушки, которые должны запускаться при удалении узла, поэтому это не мудрая идея. Например, он оставит данные в таблице ревизий, и Drupal потерпит крах, когда ударит по уже используемому nid, пытаясь создать ревизию.
Молот

@ Mołot, если вы усекаете таблицу узлов и ревизий, у вас нет проблем. Я проверяю это, и у меня нет проблем
Шахаб

Тот факт, что в вашей конкретной установке этот метод был успешным, не доказывает, что он всегда будет работать.
Молот
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.