我遇到过一个奇怪的SQL查询,比如

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

我预计它会失败,因为我要为varchar列添加一个布尔缺省值.但至少在Postgres,它得到了成功的执行,我看到了以下几点:

SQL query result

在我看来像是某种奇怪的胁迫

为什么此查询没有因为类型不匹配而失败?

推荐答案

存在从booleantext的赋值强制转换,因此如果存在对目标数据类型的赋值强制转换,则DEFAULT值必须是可接受的.

查看pg_attrdef目录中的adbin列,我可以看到存储的实际默认表达式是

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

其中,外部函数是到varchar(255)的转换.

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

如何并行SELECT和RESET?

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

在Postgres中实现合并功能的干净方法,因为当目标/源不匹配时

MariaDB查询在逗号分隔的字符串中查找多个值

Oracle SQL根据列中的条件 Select 最大记录数

如何查询jsonb列是一个对象数组?

将结果从一列转换为两行或更多

如何将不同层次的产品组和规格组合到最深一层?

Proc SQL Select Distinct SAS

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

如何创建snowflake表(动态查找数据类型)并从阶段加载(AWS S3)?

Spark / Hive:如何获取列中正值的百分比?

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

每个ID的SQL返回可能的最低级别及其值

REGEXP_SUBSTR使用方法

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

从 varchar 列中删除特殊字符后的前面的零和字符时遇到问题

当计数为 0 时显示行

从多个连接返回 1 行到同一个表 - SQL Server