标签: null

在 Oracle 中不使用可为空数字的原因?

我们公司正在与另一家软件公司进行联合项目的接口,我们被告知,如果不应该显示特定值,我们应该传入 -5000(他们的任意标记值);原因是他们的 Oracle 数据库中没有数字列支持空值,这是根据他们(现在是前任)Oracle 开发人员的建议。这家公司还在 VB6 中编写了绝大多数代码(慢慢过渡到 VB.NET,这是另一天的另一个话题......)。出于纯粹的好奇,这个推荐有什么正当理由吗?我想不出任何站在我这边的人。

- - 编辑

感谢大家的反馈。我在 CodeProject.com(链接)上提出了同样的问题,并收到了非常相似的反馈。似乎唯一一次可以开始证明这种做法是与外键有关的,我可以声明它们在系统中的任何地方都没有使用外键。做出此决定的开发人员(我曾经在该公司工作)的经验比我多得多,因此我想确保在遭到嘲笑之前没有正当理由。

null oracle database-design

12
推荐指数
4
解决办法
3676
查看次数

两个可为空的列之一需要具有值

无解释问题:

反正有 2 个空值的约束,总是需要 1 有 value 吗?例如,两个日期列都为空,但至少有1 个需要有值

问题描述:

假设我有一个名为 Expense 的表

并有 2 个日期:

prevision_expense_expiration_date DATE NULLABLE 费用_payment_date DATE NULLABLE

这两列的逻辑如下:

我买了一些东西,我知道我必须为它付款,某个日期,比如电话费。我会将此作为费用输入,并带有费用支付日期。这个日期是我应该付款的假定日期,而不是实际付款日期,例如发票的到期日期。

在其他情况下,我出售某些提供商的礼品卡以获取其服务。当客户兑换卡时,我可能需要向我的提供商购买服务转移给我的客户。因此,礼品卡有一个到期日期,我想为该“费用”做一个预想,而不是在礼品卡有效期内作为费用插入,如果礼品卡过期,则该“费用”不应进入帐户系统。

我知道我可以有 2 个相同的表,称为 prevision_expense 和confirmed_expense,但听起来不对,所以我在同一个表中,2 个日期,可以为空,但我想限制或其他东西,以便始终需要一个。

还有另一种可能的策略:

payment_date 日期非空 is_prevision_date BOOL 非空

因此,在这种情况下,如果日期是 prevision bool 值将为 1,否则将为 0。没有空值,一切都很好。除了我想要在第一次有一个预设日期时存储两个值的选项,然后(让我们说两天后)有该费用的确认日期,在这种情况下,使用策略 2 我将没有该选项。

我在数据库设计中做错了什么吗?:D

mysql null database-design

12
推荐指数
1
解决办法
1万
查看次数

快速将 NULL 列更改为 NOT NULL

我有一个包含数百万行和一个允许 NULL 值的列的表。但是,当前没有一行具有该列的 NULL 值(我可以通过查询快速验证这一点)。但是当我执行命令时

ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;
Run Code Online (Sandbox Code Playgroud)

相对而言,查询需要永远。它实际上需要 10 到 20 分钟,是添加检查约束的两倍多。有没有办法立即更新该列的表元数据,尤其是因为我知道该列没有任何行具有 NULL 值?

sql-server-2008 null alter-table

12
推荐指数
2
解决办法
1万
查看次数

计算列中的空值和非空值

如何在 MySQL 的同一列上计数和检索 null 和 not null?

我的表

---------------------------------------------------
id   |    name    |      visited   |   registDate |
---------------------------------------------------
1    |    george  |       NULL     |   2014-04-01 |
---------------------------------------------------
2    |    Thomas  |       NULL     |   2014-04-15 |
---------------------------------------------------
3    |    Wilfred |        1       |   2014-04-24 |
---------------------------------------------------
4    |    paul    |        1       |   2014-04-10 |
---------------------------------------------------
5    |    elina   |       NULL     |   2014-05-03 |
---------------------------------------------------
6    |    angela  |       NULL     |   2014-04-13 |
---------------------------------------------------
7    |    elina   |        1       |   2014-05-18 | …
Run Code Online (Sandbox Code Playgroud)

mysql null count

12
推荐指数
2
解决办法
5万
查看次数

为什么我需要将 NULL 转换为列类型?

我有一个助手,它正在生成一些代码来为我进行批量更新,并生成如下所示的 SQL:

( active 和 core 字段都是 type boolean

UPDATE fields as t set "active" = new_values."active","core" = new_values."core"
FROM (values 
(true,NULL,3419),
(false,NULL,3420)
) as new_values("active","core","id") WHERE new_values.id = t.id;
Run Code Online (Sandbox Code Playgroud)

但是它失败了:

ERROR: column "core" is of type boolean but expression is of type text

我可以通过添加::boolean空值来让它工作,但这看起来很奇怪,为什么 NULL 被认为是类型TEXT

此外,转换有点棘手,因为它需要对代码进行大量修改才能知道它应该将 NULL 转换为什么类型(列和值的列表目前是从一个简单的 JSON 对象数组自动生成的) .

为什么这是必要的,是否有更优雅的解决方案,不需要生成代码知道 NULL 的类型?

如果相关,我将在Node.JS上使用sequelize来执行此操作,但在 Postgres 命令行客户端中也得到相同的结果。

postgresql null cast

12
推荐指数
1
解决办法
6574
查看次数

为什么 COUNT() 为“NULL”聚合返回 0?

SELECT 语句返回几行:

SELECT
  ColA
FROM
  TableA
WHERE
  ColA IS NULL
Run Code Online (Sandbox Code Playgroud)

我在 TableA 中得到 47 行的 ColA 为“NULL”。

ColA
NULL
NULL
NULL
etc...
Run Code Online (Sandbox Code Playgroud)

如果我向这个查询添加一个聚合:

SELECT
  ColA,
  COUNT(ColA) AS theCount
FROM
  TableA
WHERE
  ColA IS NULL
GROUP BY ColA
Run Code Online (Sandbox Code Playgroud)

我得到

ColA | theCount
NULL | 0
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该怎么做才能避免这种情况?

null sql-server aggregate

11
推荐指数
2
解决办法
6万
查看次数

如何在 SQL Server 中进行比较时包含空值?

所以基本上在 SQL Server 中,NULL 意味着没有值,因此无法比较它返回一些意外的结果。

例如,以下查询不会返回值为 NULL 的行,但我希望它返回:

SELECT *
FROM table
WHERE
  (value != 26)
  AND date IS NULL
  AND last_modified >= '5/21/2014'
Run Code Online (Sandbox Code Playgroud)

我知道我可以做以下作为一种解决方法,但认真吗?每次我想包含它时,都必须添加括号并检查每个字段是否为空?看起来丑陋,不直观和疯狂。

SELECT *
FROM table
WHERE
  (value != 26 OR value is null)
  AND date IS NULL
  AND last_modified >= '5/21/2014'
Run Code Online (Sandbox Code Playgroud)

我的意思是我知道 NULL 不是一个值,因此无法进行比较,但您不能推断它实际上绝对不是 26 吗?如果 26 是什么,NULL 是什么,什么都不是什么,那么 NULL 不是 26。对我来说似乎是合乎逻辑的。

有谁知道我如何以更简洁的方式在使用比较时在结果中包含空值,而不必每次都包含显式检查。同样关闭我的表上的空值绝对不是一种选择。

编辑:

我为什么不想像我展示的那样做的真正问题并没有暴露出来。所以就到这里了。我正在编写一个程序,让您构建对数据库表的查询,让用户动态创建过滤器等,基本上在一天结束时构建 SQL 语句并将结果显示给用户。用户选择的字段可以是给定数据库中的任何和/或所有字段,如果我必须逐字地将 ISNULL 检查放在每个字段上,这将非常低效,并使查看 SQL 变得非常难看。我的程序与表定义无关,这意味着我不在乎你的表中有什么,也不想知道你的表的定义是什么。我只是想让你选择一个表格,选择一些字段来过滤等于、不等于、在、不在等......

null sql-server t-sql

10
推荐指数
2
解决办法
5万
查看次数

在 PostgreSQL 中不为不能为空的字段指定 NOT NULL 的后果是什么?

我有一个应用程序(数据存储在 PostgreSQL 中),其中表中的大多数字段始终不为空,但这些表的架构并未强制执行此操作。例如看看这个假表:

CREATE TABLE "tbl" (
    "id" serial,
    "name" varchar(40),
    "num" int,
    "time" timestamp
    PRIMARY KEY ("id"),
    UNIQUE ("id")
);
Run Code Online (Sandbox Code Playgroud)

此外namenum,time没有明确声明为NOT NULL,实际上它们是,因为强制执行发生在应用程序端。


我的感觉是应该改变它,但相反的是应用程序级别确保这里不能出现空值并且没有其他人手动修改表。

我的问题是:通过设置一个显式NOT NULL约束?

我们有一个很好的代码审查流程和一个相当好的文档,所以一些新人会提交打破这个限制的东西的可能性并不足以证明改变是合理的。

这不是我的决定,所以这正是我寻找其他理由的原因。在我看来,如果某些内容不能为空并且数据库允许您指定某些内容不为空 - 那就去做吧。特别是如果更改非常简单。

schema postgresql null

10
推荐指数
2
解决办法
2438
查看次数

为什么 PostgreSQL 在禁止 NULL 的域中允许 NULL?

PostgreSQL 允许NULL在标记为 的域中使用s NOT NULL。这是为什么,文档是这么说的,

尽管存在这样的约束,但名义上属于域类型的列仍有可能读取为空。例如,如果域列位于外连接的可为空一侧,则这可能发生在外连接查询中。

这能更好地解释吗?

postgresql null domain

10
推荐指数
1
解决办法
686
查看次数

mysql - 带有空值的唯一索引 - 任何人的实际解决方案?

CREATE TABLE IF NOT EXISTS b2c_constants (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(64) NOT NULL,
    is_deleted BOOL DEFAULT FALSE,
    UNIQUE (name)
) ENGINE InnoDB CHARSET utf8 COLLATE utf8_unicode_ci

CREATE TABLE IF NOT EXISTS b2c_constant_bindings (
    constant_id INT UNSIGNED NOT NULL,
    company_id INT UNSIGNED NOT NULL,
    object_id INT UNSIGNED DEFAULT NULL,
    property_id INT UNSIGNED DEFAULT NULL,
    value VARCHAR(255) NOT NULL,
    UNIQUE (constant_id, company_id, object_id, property_id),
    FOREIGN KEY (constant_id) REFERENCES b2c_constants (id) ON UPDATE RESTRICT ON DELETE CASCADE, …
Run Code Online (Sandbox Code Playgroud)

mysql null unique-constraint

9
推荐指数
1
解决办法
2万
查看次数