在许多类型的SQL中,有三种方法可以在每次插入行时将列隐式设置为NULL.这些是:

columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

即,第一个设置NULL标志(与NOT NULL相反),第二个将NULL标志保留为默认值,第三个设置NULL标志并将隐式值设置为NULL.

我听说在Microsoft SQL中,第二种变体并不完全相同,因为您还可以自定义表或模式的NULL标志的默认值.

但是对于MySQL,我不相信有这样的功能.此外,在MySQL中,与NOT NULL columns不同,如果没有显式值,则带有NULL标志的列在插入时总是隐式设置为NULL,即使启用了strict模式.因此,所有这些列声明都是相同的.

在我的MySQL脚本中,对于每个NOTNULL列,我都为我不希望在应用程序的某些插入中设置的列指定一个默认值,以避免在启用严格模式时出现任何问题.因此,我觉得如果我 Select 第三种变体,它会更加对称,即使它是最详细和明确的.像第三种变体这样的声明是常见的,还是第一种或第二种变体在其他脚本中出现得更频繁?

我考虑采用第二种方法,因为MySQL dump使用的是别名,但我不确定这是否是一个好主意,因为它还将整数文本作为字符串(单引号)转储到列声明的默认子句中.

这个问题可能看起来更像是一个观点,而不是一个有解决方案的问题,但我也想知道任何我不知道的潜在问题.将来我可能会 Select 从MySQL迁移到PostgreSQL,我也可以从这些专家那里得到一些建议,例如,PostgreSQL是否能像MS-SQL那样区分这些情况.如果我做了错误的假设,请纠正我.

推荐答案

我遇到的每个数据库都以您描述的方式处理null.当一列接受空值时,如果不在INSERT上提供值,则默认值为空.我相信这是ANSI标准行为的一部分.

至于指定"NULL"本身.这是一个偏好的问题.该标准确实规定了一个列允许空值unless而不是空值(在数据定义语言级别).因此,空值本身是不必要的,您还有第四个等价选项:

columnname type

Null通过ANSI标准嵌入到SQL语言中.你的第三个 Select 是最明确的,但它看起来也有点不寻常.

如果你计划在整个系统中保持超级一致性,那么我会 Select 你现在的道路.对于每个表中的每一列,都有NULL或NOT NULL.对于所有采用默认值的列,使用default语句.

然而,不要期望与你共事的其他人(现在或将来)轻易效仿这个例子.在这种情况下,许多人更喜欢第四个选项,因为它需要更少的类型,并且是所有(或几乎所有)SQL方言的行为方式.

Postgresql相关问答推荐

读取扩展坞合成中的UDP:IO/超时

到第二天的Postgres计时器

supabase 中的交易

如何使用 go-pg 包删除所有记录

PostgreSQL - 列出模式中的所有唯一约束

PostgresQL:获取两个数组之间的对应数量

如何将两条线几何连接成一条记录?

Psycopg2 在大型 Select 查询中耗尽内存

Rails:创建删除表级联迁移

处理 sqlalchemy 断开连接的更好方法

OpenShift:如何从我的 PC 连接到 postgresql

Postgres COPY FROM csv file-No such file or directory

PostgreSQL ORDER BY 问题 - 自然排序

使用 pg-promise 插入多条记录

仅在存在时重命名列

如何删除 Postgres 上的所有数据库?

从长时间的postgres转换日期

PostgreSQL:如何在用户级别设置 search_path?

ruby on rails jsonb 列默认值

用于将布尔列排序为 true、null、false 的 SQL