PostgreSQL показывает неверные детали последовательности в информационной схеме таблицы - PullRequest
0 голосов
/ 25 февраля 2019

Недавно я увидел странный сценарий с моей базой данных PostgreSQL.Информационная схема моей базы данных показывает другое имя последовательности, чем то, которое фактически выделено для столбца моей таблицы.

Проблема:

У меня есть таблица tab_1

id  name 
1   emp1
2   emp2
3   emp3

Ранее столбец id (integer) таблицы был автоматически сгенерированным полем, в котором порядковый номер был сгенерирован во время выполнения через JPA. (имя последовательности: tab_1_seq)

Мы внесли изменение и обновили столбец таблицы id до bigserial, и последовательность сохраняется на уровне столбца (выделеноновая последовательность: tab_1_temp_seq) больше не обрабатывается JPA.

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

При анализе проблемы я обнаружил несоответствие между последовательностями, выделенными для таблицы.

В структуре таблицы мы гдепоказана последовательность как tab_1_temp_seq, а в таблице information_schema таблица была назначена со старой последовательностью - tab_1_seq.

Я не уверен, что на самом деле вызвало это, так как мы не управляем нашей системой баз данных.Если у вас возникли какие-либо проблемы, подобные этой, пожалуйста, дайте мне знать его основную причину.

Запросы:

ВЫБЕРИТЕ имя_таблицы, имя_столбца, имя_столбца из файла information_schema.columns где имя_таблицы ='tab_1';

результат:

table_name   column_name  column_default
tab_1        id           nextval('tab_1_seq::regclass')

Ниже приведена подробная информация в структуре / свойствах таблицы:

id      nextval('tab_1_temp_seq::regclass')  

name    varChar

1 Ответ

0 голосов
/ 26 февраля 2019

Возможно, вы страдаете от повреждения данных, но, скорее всего, вы страдаете от плохих инструментов для визуализации объектов вашей базы данных.Какая бы программа ни показала вам, «структура / свойства таблицы» могут быть перепутаны.

Чтобы узнать правду (какое значение DEFAULT использует PostgreSQL), запустите:

SELECT pg_get_expr(adbin, adrelid)
FROM pg_attrdef
WHERE adrelid = 'tab1'::regclass;

Это такжечто покажет information_schema.columns, но я добавил ясный запрос для ясности.

Это значение DEFAULT будет использоваться всякий раз, когда инструкция INSERT либо не указывает столбец id, либо заполняет егоспециальное значение DEFAULT.

Возможно, путаница также вызвана различными программами, которые могут устанавливать значения по умолчанию на своем пути.Способ, который я показал выше, - это способ PostgreSQL, но ничто не может помешать стороннему инструменту использовать собственную последовательность для заполнения id.

...