Я конвертирую БД из Postgres в MySQL.
Так как я не могу найти инструмент, который делает сам трюк, я собираюсь преобразовать все последовательности postgres в идентификаторы автоинкремента в mysql со значением автоинкремента.
Итак, как мне перечислить все последовательности в базе данных Postgres ( версия 8.1 ) с информацией о таблице, в которой она используется, следующем значении и т. Д. С запросом SQL?
Имейте в information_schema.sequences
виду, что я не могу использовать представление в версии 8.4.
Ответы:
Следующий запрос дает имена всех последовательностей.
Обычно последовательность называется как
${table}_id_seq
. Простое сопоставление с регулярным выражением даст вам имя таблицы.Чтобы получить последнее значение последовательности, используйте следующий запрос:
источник
${table}_id_seq
Намек был полезен${table}_${column}_seq
для автоматически созданных последовательностейОбратите внимание, что начиная с PostgreSQL 8.4 вы можете получить всю информацию о последовательностях, используемых в базе данных:
Поскольку я использую более высокую версию PostgreSQL (9.1) и искал один и тот же ответ, высокий и низкий, я добавил этот ответ для будущих поколений и для будущих пользователей.
источник
Запустите:,
psql -E
а затем\ds
источник
после небольшой боли я понял.
лучший способ добиться этого - перечислить все таблицы
а затем, для каждой таблицы, перечислите все столбцы с атрибутами
затем для каждого столбца проверьте, имеет ли он последовательность
а затем получить информацию об этой последовательности
источник
информация о последовательности: максимальное значение
SELECT * FROM information_schema.sequences;
информация о последовательности: последнее значение
SELECT * FROM <sequence_name>
источник
Связь между автоматически сгенерированными последовательностями (например, созданными для столбцов SERIAL) и родительской таблицей моделируется атрибутом владельца последовательности.
Вы можете изменить это отношение, используя предложение OWNED BY команды ALTER SEQUENCE.
например, ALTER SEQUENCE foo_id, СОБСТВЕННЫЙ от foo_schema.foo_table
установить привязку к таблице foo_table
или ПОСЛЕДОВАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ foo_id, СОБСТВЕННАЯ ОТСУТСТВУЕТ
разорвать связь между последовательностью и любой таблицей
Информация об этом отношении хранится в таблице каталога pg_depend .
отношение соединения - это связь между pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - которая связывает последовательность с записью соединения, а затем pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r', которая связывает присоединить запись к собственному отношению (таблица)
Этот запрос возвращает все зависимости последовательности -> таблицы в базе данных. Предложение where фильтрует его, чтобы оно включало только автоматически сгенерированные отношения, что ограничивает его отображением только последовательностей, созданных столбцами с типом SERIAL.
источник
Я знаю, что этот пост довольно старый, но я нашел решение CMS очень полезным, так как я искал автоматический способ связать последовательность со столбцом таблицы AND и хотел поделиться им. Использование таблицы каталога pg_depend было ключевым. Я расширил то, что было сделано, чтобы:
Эта версия добавляет столбец в список возвращаемых полей. Имея как имя таблицы, так и имя столбца, вызов pg_set_serial_sequence позволяет легко убедиться, что все последовательности в базе данных установлены правильно. Например:
Надеюсь, это поможет кому-то сбросить последовательности!
источник
Этот оператор перечисляет таблицу и столбец, который связан с каждой последовательностью:
Код:
подробнее смотрите здесь ссылку для ответа
источник
Улучшение предыдущего ответа:
источник
Частично проверено, но выглядит в основном завершенным.
Кредит, при котором кредит должен быть ... он частично обратно спроектирован из SQL, записанного из \ d в известной таблице с последовательностью. Я уверен, что это тоже может быть чище, но эй, производительность не была проблемой.
источник
Что-то вроде хака, но попробуйте это:
Удалить последний UNION и выполнить результат
источник
Получите последовательности по каждому столбцу каждой таблицы с помощью синтаксического анализа предложения DEFAULT. Этот метод предоставляет информацию о том, с какими последовательностями столбцов связаны, и не использует зависимости, которые могут не существовать для некоторых последовательностей. Даже
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
функция нашла не все последовательности для меня!Решение:
Обратите внимание, что 1 последовательность может использоваться в нескольких таблицах, поэтому она может быть указана здесь в нескольких строках.
источник
Спасибо за вашу помощь.
Вот функция pl / pgsql, которая обновляет каждую последовательность базы данных.
источник
Вот еще один, который имеет имя схемы рядом с именем последовательности
источник
Эта функция показывает last_value каждой последовательности.
Он выводит таблицу из 2 столбцов, в которой указано имя последовательности плюс последнее сгенерированное значение.
источник
Предполагая, что
exec()
функция объявлена в этом посте https://stackoverflow.com/a/46721603/653539 , последовательности вместе с их последними значениями могут быть получены с помощью одного запроса:источник
источник
Вот пример того, как использовать,
psql
чтобы получить список всех последовательностей с ихlast_value
:psql -U <username> -d <database> -t -c "SELECT 'SELECT ''' || c.relname || ''' as sequence_name, last_value FROM ' || c.relname || ';' FROM pg_class c WHERE (c.relkind = 'S')" | psql -U <username> -d <database> -t
источник