Postgres изменяет значения таблицы по умолчанию на «NULL :: переменный символ» вместо NULL

Я использую psql для изменения таблицы базы данных. В настоящее время выполняется следующий оператор alter:

ALTER TABLE "devices" ADD "device_id" VARCHAR(255) NULL DEFAULT NULL;

но я получаю следующее в инструкции create-table:

"device_id" VARCHAR(255) NULL DEFAULT 'NULL::character varying'

Почему по умолчанию установлено значение 'NULL::character varying'?

Я немного сбит с толку, так как в таблице уже есть несколько полей varchar, где значение по умолчанию правильное. Например, из инструкции CREATE:

"external_id" VARCHAR(50) NULL DEFAULT NULL,

К вашему сведению: этот столбец, external_id, был создан несколько лет назад, до того, как я начал прикасаться к таблице.


person Thor A. Pedersen    schedule 26.05.2021    source источник
comment
Как вы генерируете оператор CREATE TABLE?   -  person a_horse_with_no_name    schedule 26.05.2021
comment
В настоящее время я использую HeidiSQL для просмотра данных и оператора CREATE.   -  person Thor A. Pedersen    schedule 26.05.2021
comment
Похоже на ошибку HeidiSQL: i.imgur.com/Nfyrimt.png   -  person a_horse_with_no_name    schedule 26.05.2021
comment
только что проверил, и это также то, что \d+ говорит мне в psql.. так что нет, это не HeidiSQL   -  person Thor A. Pedersen    schedule 26.05.2021
comment
Вероятно, вы использовали default 'NULL' не то, что вставили в вопрос.   -  person a_horse_with_no_name    schedule 26.05.2021
comment
Нет, я использую утверждение, написанное в вопросе.   -  person Thor A. Pedersen    schedule 26.05.2021
comment
Что ж, должно быть что-то, о чем вы нам не говорите, потому что это работает, как и ожидалось, см. этот снимок экрана   -  person a_horse_with_no_name    schedule 26.05.2021
comment
на твоей картинке то же самое, я испытываю. Я запускаю оператор alter, мне нужен VARCHAR(255), который по умолчанию равен NULL.. но вместо этого по умолчанию используется NULL::character varying.. который также показывает ваше изображение.. и я спрашиваю, почему это так?   -  person Thor A. Pedersen    schedule 26.05.2021
comment
Я не понимаю, так как в таблице есть более старые столбцы, которые по умолчанию не NULL::character varying, а просто NULL, что, насколько мне известно, является правильным способом.   -  person Thor A. Pedersen    schedule 26.05.2021


Ответы (1)


Поскольку вы явно установили значение по умолчанию в NULL, PostgreSQL добавил столбец по умолчанию. Значения по умолчанию не сохраняются в строковой форме, а анализируются и сохраняются в виде дерева разбора (в двоичной форме). Когда вы отображаете определение таблицы, PostgreSQL «деанализирует» эту информацию, что приводит к (эквивалентному) NULL::character varying (:: — это приведение типа).

Это нормально, но если вы находите это визуально неприятным, вы можете просто отказаться от значения по умолчанию:

ALTER TABLE devices ALTER device_id DROP DEFAULT;

Это позволит избавиться от значения по умолчанию, которое не изменит поведение («значение по умолчанию по умолчанию» равно NULL).

person Laurenz Albe    schedule 26.05.2021
comment
Но 'NULL::character varying' (это то, что Тор утверждает, что видит) отличается от NULL::character varying (чего он и ожидает) - person a_horse_with_no_name; 26.05.2021
comment
Оператор CREATE в HeidiSQL отображает это значение по умолчанию в виде строки да... и я просто скопировал его сюда... но оператор psql отображает его как просто NULL::character varying без одинарных кавычек, так что все в порядке... я просто интересно, почему некоторые из моих столбцов в операторе CREATE были: .. DEFAULT NULL, ..., а некоторые были DEFAULT 'NULL::character varying', .... Но похоже, что это просто приведение типов. Единственный вопрос, который остается для меня, это... как получилось, что старый/пред. столбцы должны быть определены как DEFAULT NULL, а не DEFAULT 'NULL::character varying'? - person Thor A. Pedersen; 26.05.2021
comment
Как эти старые значения по умолчанию выглядят в psql при отображении определения таблицы с помощью \d? - person Laurenz Albe; 26.05.2021
comment
разве они все не должны быть DEFAULT 'NULL::character varying' ?.. даже если старый/пред. столбцы были созданы в более старой версии БД - person Thor A. Pedersen; 26.05.2021
comment
Это не имеет ничего общего с версией — разница в том, установили ли вы значение по умолчанию или нет. - person Laurenz Albe; 26.05.2021
comment
psql показывает следующее для device_id: i.imgur.com/OojvKqI.png — старый/пред. столбцы: i.imgur.com/Xeh6rxA.png - и HeidiSQL отображает их следующим образом: i.imgur.com/6csFB5S.png - person Thor A. Pedersen; 26.05.2021
comment
Это подтверждает, что вы определили старые столбцы без указания значения по умолчанию, в то время как вы использовали DEFAULT NULL для новых столбцов. - person Laurenz Albe; 26.05.2021
comment
круто .. я не создавал эти столбцы, поэтому мне было любопытно .. они также были созданы с помощью ORM django .. где указано, что столбец может быть нулевым .. но значение по умолчанию не было установлено (указано в python- код). - person Thor A. Pedersen; 26.05.2021