【问题标题】:Postgres alter table defaults to 'NULL::character varying' instead of NULLPostgres alter table 默认为 'NULL::character varying' 而不是 NULL
【发布时间】:2021-08-14 12:00:51
【问题描述】:

我正在使用 psql 来更改数据库表。当前正在运行以下更改语句:

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

但我最终在 create-table-statement 中得到以下内容:

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

为什么默认设置为'NULL::character varying'

我有点困惑,因为该表已经有多个 varchar 字段,其中默认值是正确的.. 来自 CREATE-statement 的前:

"external_id" VARCHAR(50) NULL DEFAULT NULL,

仅供参考:此专栏external_id 是多年前在我开始接触表格之前创建的。

【问题讨论】:

  • 如何生成 CREATE TABLE 语句?
  • 目前我正在使用 HeidiSQL 查看数据和 CREATE-statement
  • 看起来像一个 HeidiSQL 错误:i.imgur.com/Nfyrimt.png
  • 刚刚检查过,这也是\d+psql 中告诉我的......所以不,它不是 HeidiSQL
  • 您可能使用了default 'NULL',而不是您在问题中提出的内容。

标签: sql postgresql null heidisql


【解决方案1】:

由于您将默认值显式设置为 NULL,因此 PostgreSQL 添加了一个列默认值。默认值以字符串形式存储,但它们被解析并存储为解析树(二进制形式)。当您显示表定义时,PostgreSQL 会“解析”此信息,从而产生(等效的)NULL::character varying:: 是一种类型转换)。

这很好,但如果你觉得它在视觉上令人不快,你可​​以简单地删除默认值:

ALTER TABLE devices ALTER device_id DROP DEFAULT;

这将摆脱默认值,这不会改变行为(“默认默认值”为 NULL)。

【讨论】:

  • 但是'NULL::character varying'(这是托尔声称看到的)与NULL::character varying(这是他所期望的)不同
  • HeidiSQL 中的 CREATE 语句将此默认值显示为字符串 yes.. 我只是将其复制粘贴到此处.. 但 psql 语句将其显示为 NULL::character varying 没有单引号,所以一切都很好..我只是想知道为什么我在 CREATE 语句中的一些列是:.. DEFAULT NULL, ...,而有些是DEFAULT 'NULL::character varying', ...。但它看起来像是“只是”类型转换。留给我的唯一问题是……旧的/上一个怎么来的。列定义为 DEFAULT NULL 而不是 DEFAULT 'NULL::character varying' ?
  • 当您使用\d 显示表定义时,这些旧默认值在psql 中的外观如何?
  • 他们不应该都是DEFAULT 'NULL::character varying' 吗?即使是旧的/上一个。列是在旧版本的数据库上创建的
  • 这确认您在未指定默认值的情况下定义了“旧列”,而“新列”使用了DEFAULT NULL
猜你喜欢
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2016-08-30
  • 2020-11-03
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多