在我的 MySQL 数据库中,我有一个名为的字段html_contents,其中包含要在网页中显示的所有 html。显然 html 可能很大,而且肯定大于 64KB,因此我决定使用LONGTEXT而不是VARCHAR.
当字段未设置或留空时,您是否认为将其设置为 NULL 或空字符串更好(对于数据库来说别名更有效)?
我读过这篇文章:何时使用 NULL 以及何时使用空字符串?但它一般谈论空字符串(可能是小字符串而不是LONGTEXT)。
我想知道 with 是否LONGTEXT是一个不同的故事,它是否可以节省大量空间或执行时间,NULL而不是留空LONGTEXT。
这只是无数让我一直感到沮丧的小细节之一,迫使我记住各种特殊代码,并导致我的查询变得比应有的更难看。
尝试以下查询来获取大小:
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 v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
Run Code Online (Sandbox Code Playgroud)
我知道添加具有默认值的新列是安全的。但是,与 组合使用仍然安全吗NOT NULL?或者它会锁定数据库吗?谢谢!
我有一个表,其中列中有很多 NULL 值。但是有些列根本不包含 NULL(尽管可以为空)。将所有这些列声明为 SPARSE 有什么缺点吗?
我一直在尝试加快我在 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 …
我有一个按以下方式定义的表:
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) 当我有一个查询来检查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) 我正在尝试运行一个工作正常的 group by 语句,但是,其中一个“组”为空。如何为该行返回“未知”?
例如:
10000
A 9999
B 9990
C 4
Run Code Online (Sandbox Code Playgroud)
等等。
第一行我想在查询中作为“未知”返回。
我的问题是是否有可能有由多列组成的唯一索引,其中一列可能包含NULL.
例子:命名“regulated_person” A表的数,包括列LAST_NAME,FIRST_NAME,BIRTH_DATE和ALIAS。的数据类型BIRTH_DATE是date,其他的则是 String/ VARCHAR。LAST_NAME,FIRST_NAME并且BIRTH_DATE不可为空,即它们需要值。ALIAS对于两个或更多人具有相同的名字/姓氏并且在同一天出生的情况,可作为决胜局。因为打破平局的情况并不常见,我想避免提供ALIAS值的需要,除非有必要。
作为后台,表的主键由自动增量生成器处理。唯一索引的目的是提供一个“业务键”,无需求助于主键即可识别行。我正在使用 MySQL 5.1.35 和 Hibernate ORM 版本。4.3.10.
欢迎任何有关除 MySQL 之外的服务器/数据库提供商的建议。
提前感谢您的任何指导,并提前为任何无意违反“论坛协议”的行为道歉,因为这是我第一次在任何地方提交问题。
这是我数据库中的表之一。为清楚起见,省略了约束。
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 触发器来检查日期并在日期无效时回滚。
我和一位同事谈过,他说从技术上讲,我正在检查数据库中的业务规则,因此应该将这项检查推送到应用程序。
是否有“正确”的方法来解决这个问题,或者基本上是开发人员认为最好的方法?
null ×10
postgresql ×4
sql-server ×3
index ×2
mysql ×2
trigger ×2
alter-table ×1
coalesce ×1
disk-space ×1
empty-string ×1
group-by ×1
hints ×1
perl ×1
subquery ×1