Sql Postgres alter table默认为';NULL::字符变化';而不是空值

Sql Postgres alter table默认为';NULL::字符变化';而不是空值,sql,postgresql,null,heidisql,Sql,Postgresql,Null,Heidisql,我正在使用psql修改数据库表。当前正在运行以下alter语句: ALTER TABLE "devices" ADD "device_id" VARCHAR(255) NULL DEFAULT NULL; "device_id" VARCHAR(255) NULL DEFAULT 'NULL::character varying' "external_id" VARCHAR(50) NULL DEFAULT NU

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

ALTER TABLE "devices" ADD "device_id" VARCHAR(255) NULL DEFAULT NULL;
"device_id" VARCHAR(255) NULL DEFAULT 'NULL::character varying'
"external_id" VARCHAR(50) NULL DEFAULT NULL,
但我在CREATETABLE语句中得出以下结论:

ALTER TABLE "devices" ADD "device_id" VARCHAR(255) NULL DEFAULT NULL;
"device_id" VARCHAR(255) NULL DEFAULT 'NULL::character varying'
"external_id" VARCHAR(50) NULL DEFAULT NULL,
为什么默认设置为
“NULL::character variabling”

我有点困惑,因为表已经有多个varchar字段,默认值是正确的。。来自CREATE语句的ex:

ALTER TABLE "devices" ADD "device_id" VARCHAR(255) NULL DEFAULT NULL;
"device_id" VARCHAR(255) NULL DEFAULT 'NULL::character varying'
"external_id" VARCHAR(50) NULL DEFAULT NULL,

仅供参考:在我开始触摸表格之前,这个名为“
external\u id
”的列是在多年前创建的。

由于您将默认值显式设置为NULL,PostgreSQL添加了一个默认列。默认值不是以字符串形式存储的,而是以解析树(二进制形式)的形式进行解析和存储的。当显示表定义时,PostgreSQL“deparses”此信息,这将导致(等效)
NULL::character variable
是类型转换)

这很好,但是如果您发现它在视觉上令人不快,您可以简单地删除默认值:

ALTER TABLE devices ALTER device_id DROP DEFAULT;

这将去掉默认值,该值不会改变行为(“默认值”为空)。

如何生成CREATE TABLE语句?目前我正在使用HeidiSQL查看数据和CREATE语句看起来像HeidiSQL错误:刚刚检查,这也是
\d+
psql
中告诉我的。。因此,不,这不是Heidisql。您可能使用了
默认的“NULL”
而不是您在问题中提出的。但是
'NULL::character variating'
(这是Thor声称看到的)与
NULL::character variating
(这是他期望的)有所不同HeidiSQL中的CREATE语句将此默认值显示为字符串yes。。我只是复制粘贴到这里。。但是psql语句只将其显示为
NULL::character variabling
,没有单引号,因此一切正常。。我只是想知道为什么CREATE语句中的一些列是:
。。默认为空,…
有些是
默认的'NULL::character variabling',…
。但它看起来像是“公正”型铸造。我唯一剩下的问题是。。为什么是旧的/旧的。列被定义为
DEFAULT NULL
而不是
DEFAULT'NULL::character variable'
?当您使用
\d
显示表定义时,这些旧的默认值在
psql
中是什么样子的?它们不都应该是
DEFAULT'NULL::character variable'
?。。即使旧的/以前的。列是在旧版本的数据库上创建的,该数据库确认您在定义“旧列”时未指定默认值,而您对“新列”使用了
default NULL