Объясните поведение ADD COLUMN xxx varchar(255) DEFAULT FALSE;

Я столкнулся со странным SQL-запросом, например

ALTER TABLE some_db.some_table
    ADD COLUMN metadata_labels varchar(255) DEFAULT FALSE;

Я ожидаю, что это не удастся, потому что я добавляю логическое значение по умолчанию для столбца varchar. Но по крайней мере на Postgres он выполняется успешно и я вижу следующее:

Мне кажется какое-то странное принуждение типа

Почему этот запрос не завершается ошибкой из-за несоответствия типов?

Какой у Вас вопрос?

Laurenz Albe 02.02.2023 18:07

Это просто неявное преобразование false в «false», аналогично тому, как вы могли бы также написать, например, по умолчанию 200, и это будет преобразовано в «200». Вместо этого используйте логический столбец, если вы действительно хотите хранить только ложные или истинные значения.

Jonas Metzler 02.02.2023 18:12

@LaurenzAlbe Я пояснил вопрос. Я ожидаю, что запрос завершится ошибкой вместо того, чтобы молча преобразовать тип, и не понимаю логики, стоящей за этим. Звучит так, будто ввод JS предостерегает меня

Dmitriusan 02.02.2023 21:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Postgres выполняет неявное преобразование типов. Это задокументировано здесь:

https://www.postgresql.org/docs/current/typeconv.html

Таким образом, ваше выражение SQL совершенно верно, поскольку false::bool может быть идеально преобразовано в 'bool'::text.

Ответ принят как подходящий

Существует приведение присваивания от boolean к text, поэтому должно быть так, что значения DEFAULT приемлемы, если есть приведение присваивания к целевому типу данных.

Глядя на столбец adbin в каталоге pg_attrdef, я вижу фактическое сохраненное выражение по умолчанию:

"varchar"(text(FALSE), 259, FALSE)

где внешняя функция — это преобразование в varchar(255).

Спасибо, я даже не знал о системных каталогах!

Dmitriusan 03.02.2023 19:50

Другие вопросы по теме