标签: null

空 LONGTEXT 还是 NULL?

在我的 MySQL 数据库中,我有一个名为的字段html_contents,其中包含要在网页中显示的所有 html。显然 html 可能很大,而且肯定大于 64KB,因此我决定使用LONGTEXT而不是VARCHAR.

当字段未设置或留空时,您是否认为将其设置为 NULL 或空字符串更好(对于数据库来说别名更有效)?

我读过这篇文章:何时使用 NULL 以及何时使用空字符串?但它一般谈论空字符串(可能是小字符串而不是LONGTEXT)。

我想知道 with 是否LONGTEXT是一个不同的故事,它是否可以节省大量空间或执行时间,NULL而不是留空LONGTEXT

mysql null empty-string database-design

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

当没有匹配记录时,为什么 SELECTing sum() 返回 null 而不是 0?

这只是无数让我一直感到沮丧的小细节之一,迫使我记住各种特殊代码,并导致我的查询变得比应有的更难看。

尝试以下查询来获取大小:

SELECT sum(amount) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)

如果它找不到sum()该数量的记录,它将返回空/空/未定义而不是 0,导致我的应用程序中的输出意外为空,而不是零的“总和”。但是sum()意味着“总和”,那么为什么不直接返回 0呢?

我知道解决方案。你“简单地”做:

SELECT COALESCE(sum(amount), 0) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)

现在即使没有记录也会返回0。但它很丑,而且用起来不再感觉“有趣”。并不是说数据库应该是一个“有趣的游戏”,但你知道我的意思:如果查询变得过于复杂/“丑陋”,那么使用它就不再令人满意,特别是如果你知道这必须是在各种地方重复出现,这不仅仅是一些晦涩难懂的、一次性的边缘案例。

让它表现成这样的背后的思考过程是什么?我还有许多与 相关的其他问题null,但对于这个问题,我将重点关注这一件事。

postgresql null database-design coalesce

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

添加新列时使用不为空的默认值是否安全?

我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:

ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
Run Code Online (Sandbox Code Playgroud)

我知道添加具有默认值的新列是安全的。但是,与 组合使用仍然安全吗NOT NULL?或者它会锁定数据库吗?谢谢!

postgresql null default-value alter-table postgresql-11

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

定义 SPARSE 列有什么缺点吗?

我有一个表,其中列中有很多 NULL 值。但是有些列根本不包含 NULL(尽管可以为空)。将所有这些列声明为 SPARSE 有什么缺点吗?

null database-design sql-server disk-space sparse-column

5
推荐指数
1
解决办法
286
查看次数

PostgreSQL pl/perl 触发器,区分 null 和空

我一直在尝试加快我在 pl/pgsql 中编写的通用审计触发器的速度。更新时,它会生成正在更新的表中的列列表,并在审计表中插入记录任何更改的行(按表、列、之前的数据、之后的数据等)。跨多个表使用相同的触发器函数。

我正在尝试使用 pl/perl,因为它对于手头的任务似乎要快得多,但我似乎遇到了区分数据库中 NULL 和空字符串 ('') 值的问题。

在我看来,如果一列从 NULL 变为空字符串(反之亦然),这是我需要记录的更改。但是,使用可用的新/旧列引用 ($_TD->{new/old}{$columnName}),我似乎无法区分实际为空的列和包含空字符串的列。我知道为空的列正在被空和 undef 检查捕获,我知道的列也是空的。

    if($_TD->{new}{$column} eq '') {
        elog(NOTICE, "New value in column $column is empty");
    }
    if($_TD->{old}{$column} eq '') {
        elog(NOTICE, "Old value in column $column is empty");
    }
    if($_TD->{new}{$column} eq undef) {
        elog(NOTICE, "New value in column $column is not defined");
    }
    if($_TD->{old}{$column} eq undef) {
        elog(NOTICE, "Old value in column $column is not defined");
    }
Run Code Online (Sandbox Code Playgroud)

我怀疑我在这里做了一些愚蠢的事情,但也许我正在尝试做一些我根本无法做的事情。有什么建议吗?

编辑 - 使用 Postgres 8.4.4 的价值

编辑 - 在查看下面 filiprem …

postgresql trigger null perl

5
推荐指数
1
解决办法
1182
查看次数

SQL Server 2008R2 - 为什么我的索引没有被使用

我有一个按以下方式定义的表:

CREATE TABLE [dbo].[MyTable]
(
   [MyTable_ID] [int] IDENTITY(1,1) NOT NULL,
   [COLUMN_WITH_DATA] [varchar](128) NOT NULL,
   [COLUMN_A] [varchar](128) NULL,
   [COLUMN_B] [varchar](128) NULL,
   [COLUMN_C] [bit] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

和这样创建的索引:

CREATE INDEX [MyTable_Index_ABC] ON [dbo].[MyTable]
(
    [COLUMN_A],
    [COLUMN_B], 
    [COLUMN_C]
) 
ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我运行以下查询:

SELECT TOP 1 [MyTable].*
    FROM [MyTable](UPDLOCK)
    WHERE
        [MyTable].[COLUMN_A] IS NULL
    AND [MyTable].[COLUMN_B] IS NULL
    AND [MyTable].[COLUMN_C] = 0
Run Code Online (Sandbox Code Playgroud)

这背后的目标是获取第一个尚未使用的记录的 COLUMN_WITH_DATA 值,然后使用非空值更新其 COLUMN_A 和 COLUMN_B,以将其标记为已使用。

我在 MyTable 中有几百万条记录,其中大约一半都有:COULMN_A 和 COLIMN_B 不是 NULL(表明数据已经被消耗)。

在这种情况下,查询运行非常缓慢,执行计划显示索引:

MyTable_Index_ABC
Run Code Online (Sandbox Code Playgroud)

除非我使用查询提示,否则不使用,在这种情况下查询运行得更快。另一方面,如果我更新所有尚未消耗的行,那就是:

COLUMN_A IS NULL AND COLUMN_B IS NULL …
Run Code Online (Sandbox Code Playgroud)

index null hints sql-server-2008-r2

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

查找包含子查询的 GUID 的“不在”空值的查询不返回任何结果

当我有一个查询来检查uniqueidentifer具有空值的表中是否不存在类型的列时,我不会得到任何结果。如果子查询不返回空值,则它工作正常,并且仅在使用not in.

我知道我可以只not null检查我的子查询,但我很好奇为什么这不起作用。

查询示例:

select a.guid from tableA a where a.guid not in (select b.guid from tableB AS b)
Run Code Online (Sandbox Code Playgroud)

工作测试:

select 1 where newid() not in (select newid())
Run Code Online (Sandbox Code Playgroud)

破碎测试:

select 1 where newid() not in (select null)
Run Code Online (Sandbox Code Playgroud)

null sql-server uniqueidentifier subquery

5
推荐指数
3
解决办法
5262
查看次数

如果所选列为空,则返回 group by 中的默认值

我正在尝试运行一个工作正常的 group by 语句,但是,其中一个“组”为空。如何为该行返回“未知”?

例如:

    10000
A   9999
B   9990
C   4
Run Code Online (Sandbox Code Playgroud)

等等。

第一行我想在查询中作为“未知”返回。

postgresql null group-by

5
推荐指数
1
解决办法
5280
查看次数

具有多列的唯一索引/约束,一列可以为空

我的问题是是否有可能有由多列组成的唯一索引,其中一列可能包含NULL.

例子:命名“regulated_person” A表的数,包括列LAST_NAMEFIRST_NAMEBIRTH_DATEALIAS。的数据类型BIRTH_DATEdate,其他的则是 String/ VARCHARLAST_NAME,FIRST_NAME并且BIRTH_DATE不可为空,即它们需要值。ALIAS对于两个或更多人具有相同的名字/姓氏并且在同一天出生的情况,可作为决胜局。因为打破平局的情况并不常见,我想避免提供ALIAS值的需要,除非有必要。

作为后台,表的主键由自动增量生成器处理。唯一索引的目的是提供一个“业务键”,无需求助于主键即可识别行。我正在使用 MySQL 5.1.35 和 Hibernate ORM 版本。4.3.10.

欢迎任何有关除 MySQL 之外的服务器/数据库提供商的建议。

提前感谢您的任何指导,并提前为任何无意违反“论坛协议”的行为道歉,因为这是我第一次在任何地方提交问题。

mysql index null

5
推荐指数
1
解决办法
5688
查看次数

检查可空数据的约束,如何处理?

这是我数据库中的表之一。为清楚起见,省略了约束。

CREATE TABLE [Person].[Person]
(
    [ID]                     INT           NOT NULL IDENTITY,       
    [Forename]               VARCHAR(16)   NOT NULL,
    [Surname]                VARCHAR(32)   NOT NULL,
    [Gender]                 CHAR(1)       NOT NULL DEFAULT 'U',
    [DateOfBirth]            DATETIME      NULL,
    [HobbiesAndInterests]    VARCHAR(256)  NULL,
    [AdditionalInformation]  VARCHAR(512)  NULL,
    [LocalCentreID]          INT           NOT NULL DEFAULT 0,
    [EmergencyContactID]     INT           NULL, 
)
Run Code Online (Sandbox Code Playgroud)

我的问题涉及出生日期字段。如果提供了值,我需要对日期进行检查。如果未提供值,则无需运行检查。

我基本上需要根据出生日期检查这个人是否年满 18 岁。如果未提供出生日期,则无需对其进行检查。

我想了几种不同的方法来解决这个问题:

第一个显然是在出生日期字段上设置检查约束,但我认为如果日期为空,这将失败。

另一种选择是在检查约束内使用标量 UDF。

我想到的最后一个选项是使用 AFTER INSERT/UPDATE 触发器来检查日期并在日期无效时回滚。

我和一位同事谈过,他说从技术上讲,我正在检查数据库中的业务规则,因此应该将这项检查推送到应用程序。

是否有“正确”的方法来解决这个问题,或者基本上是开发人员认为最好的方法?

trigger null sql-server check-constraints

5
推荐指数
1
解决办法
4843
查看次数