gpt4 book ai didi

sql - 检查唯一性时我应该使用空字符串而不是 NULL 吗?

转载 作者:行者123 更新时间:2023-12-03 18:55:45 27 4
gpt4 key购买 nike

我对数据库设计还比较陌生,我正在用 SQLite 制作一个表。我以为我被教导最好使用 NULL 代替空字符串,所以这就是我一直在做的事情。我正在使用以下行构建地址表:

CREATE TABLE addresses (
addressID INTEGER PRIMARY KEY,
officeName TEXT,
address TEXT NOT NULL CHECK(address<>''),
UNIQUE (officeName, address)

并使用该行将地址添加到数据库(通过 PHP PDO)
INSERT OR IGNORE INTO addresses (officeName,address) VALUES (?,?)

该行应该检查 officeName/address 是否已经在数据库中,如果是则忽略它,如果不是则添加它。 “地址”始终为非空字符串,但有时 officeName 为空白。如果我将其设为 NULL,它会不断添加,就好像每个 NULL 都是不同的(如果它只是一个空字符串,它就可以正常工作)。我确实找到了 this article说是的,NULL 在唯一列中被视为不同。这让我想知道……我应该总是只使用一个空字符串而不是 NULL 吗?是否有过使用 NULL 代替“最佳实践”的情况?我认为这始终是最佳实践,但现在我认为它可能永远不会是最佳实践。

最佳答案

NULL和空字符串在语义上是不同的,就像 NULL0在语义上是不同的。
NULL意思是“没有值(value)”。在你的情况下,那将是“没有地址”。

空字符串是零长度的字符串字符串值。在您的情况下,这将是一个空字符串的地址。

是否使用NULL或者空字符串取决于情况的语义,就像决定是否使用 NULL0 .

但是,NULL s 在比较时有点乱,IN , 索引, DISTINCT , 和 GROUP BY . Everyone seems to do things a little differently (仅供引用,此链接不涵盖 SQL Server,它以另一种方式执行此操作),因此不幸的是,通常会做出妥协以适应特定的所需行为,具体取决于 DBMS。

在您的情况下,如果您想使用您感兴趣的 SQLite 功能,则必须使用空字符串。

SQLite was originally coded in such a way that [NULLs are never distinct]. But the experiments run on other SQL engines showed that none of them worked this way. So SQLite was modified to work the same as Oracle, PostgreSQL, and DB2. This involved making NULLs indistinct for the purposes of the SELECT DISTINCT statement and for the UNION operator in a SELECT. NULLs are still distinct in a UNIQUE column. This seems somewhat arbitrary, but the desire to be compatible with other engines outweighed that objection.



然而,要知道 INSERT OR IGNORE是 SQLite 独有的;因为您不会询问其他 DBMS 是否使用该语句。

最佳实践是根据您的意思做出决定:没有值(value),或者没有字符的值(value)。 (当然,您可能总是出于个人原因选择放弃最佳实践。)

关于sql - 检查唯一性时我应该使用空字符串而不是 NULL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20028209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com