Можно ли удалить использованные primery key в postgreSQL?
Есть БД, где в колонке id(primery key) автоматически нумеруются записи. Но проблема в том, что если, к примеру, удалить одну из записей, то автоматически созданный id, который у неё был, уже нельзя будет использовать для другой записи. В итоге, как видно на картинке, всего у меня столбцов 6, а id уже дошёл до 21. Можно ли это как-то исправить и вернуть нумерацию в порядок?
Ответы (2 шт):
Главный вопрос 'А зачем?'...смысл pk чтоб он не повторялся в прошлом и не пересекался в будущем.
Если нужны номера строк, то они формируются при выборке - на картинке левее.
Но если хочется.... то можно. В постгресе эти номера строятся на основе уникального индекса и внешнего счётчика как значение по умолчанию. Раскрой те схему таблицы и посмотрите имя счётчика. Или командой
pg_get_serial_sequence('table_name','column_name')
И отвечая на вопрос
ALTER SEQUENCE pg_get_serial_sequence('table_name','id') RESTART WITH 3;
Что конечно убьёт производительность новых вставок так как надо будет перед каждой вставкой проверять ограничение уникальности вручную.
Можно ли это как-то исправить и вернуть нумерацию в порядок?
Забудьте об этом. И вообще никогда не пускайте такую мысль себе в голову.
Первичный ключ - это специальная конструкция в структуре таблицы. Единственным её назначением является уникальная идентификация записи в течение всего срока существования таблицы. Обращаю особое внимание - именно таблицы, а не самой записи! То есть даже если запись была удалена, её уже нет, но тем не менее значение первичного ключа, которое у неё было, указывает на эту несуществующую сейчас запись. Да, необычная концепция, но её нужно и принять, и осознать.
Вообще первичный ключ - это чисто внутреннее дело сервера. И в нормальных условиях получение/просмотр его значения нужен в одном-единственном случае - если нужно убедиться, что значению первичного ключа не грозит переполнение.
Любая попытка возложить на значение первичного ключа какую-то дополнительную функцию - это плохо. Надо ли говорить, что если нечто выполняет несколько разных функций, то все их оно выполняет плохо. Или во всяком случае хуже, если бы каждая функция выполнялась отдельным, специально предназначенным только для этой функции, чем-то.
Нужна непрерывная нумерация? создайте для неё отдельное поле, и заботьтесь о том, чтобы в нём не было "дырок".
