@ Запрос Зохайба почти, но не совсем правильный. Есть пара вопросов.
Я скопировал его в свой ответ для дальнейшего использования. Не используйте это :
SELECT adsrc as default_value
FROM pg_attrdef pad, pg_atttribute pat, pg_class pc
WHERE pc.relname='your_table_name'
AND pc.oid=pat.attrelid AND pat.attname='your_column_name'
AND pat.attrelid=pad.adrelid AND pat.attnum=pad.adnum
Он скопирован из какого-то блога. То, что он упоминает, это хорошо. Но в таком случае источник должен быть добавлен. Люди, читающие этот блог, должны быть предупреждены.
Опечатка в pg_atttribute
- исправлена легко.
Не возвращает никаких строк, если для запрошенного столбца не задано значение по умолчанию. Лучше сделать это LEFT JOIN pg_attrdef ON ..
, чтобы вы всегда получали результирующую строку, если столбец существует. Это будет NULL, если нет значения по умолчанию, что на самом деле является правильным результатом, потому что NULL
- это значение по умолчанию.
Если вы удалите attname
из предложения WHERE, вы получите значения только для столбцов, которые действительно имеют значение по умолчанию. Не для других. И вам нужно добавить attname
в список SELECT, или вы не будете знать, для какого столбца.
Запрос также возвращает значение по умолчанию для уже удаленного столбца, что является неверным . Подробнее о см. В руководстве .
Но самое главное: запрос может дать совершенно неправильный результат, так как он не учитывает имя схемы. В базе данных postgres может быть любое число table1.col1
: в различных схемах. Если у нескольких есть значения по умолчанию, вы получите несколько значений. Если у столбца, который вы имеете в виду, нет значения по умолчанию, а у другого в другой схеме - вы будете обмануты и никогда его не узнаете.
Подводя итог:
Копирование / вставка из какого-либо блога без понимания пошло опасно неправильно!
Попробуйте вместо этого:
SELECT d.adsrc AS default_value
FROM pg_catalog.pg_attribute a
LEFT JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)
= (d.adrelid, d.adnum)
WHERE NOT a.attisdropped -- no dropped (dead) columns
AND a.attnum > 0 -- no system columns
AND a.attrelid = 'myschema.mytable'::regclass
AND a.attname = 'mycolumn';
LEFT JOIN
гарантирует, что вы получите результат, пока существует столбец. Если вы хотите исключить , сделайте вместо этого JOIN
. Но будьте готовы к тому, чтобы время от времени не устраивать скандалов.
Имейте в виду, что специальное приведение ::regclass
учитывает текущую настройку для search_path
, поэтому даже если вы не включите схему в имя (что вам следует, безусловно!), Вы получите ожидаемый результат.
Подробнее об этом читайте в руководстве .
Включая pg_class
является избыточным, как только у нас будет OID таблицы. Пропустить и ускорить запрос.