哪个约束确保一列输入了一些值?我在主键和非空约束之间感到困惑。
3 回答
一个NOT NULL
约束。
参与 PK 的所有列也必须不允许NULL
,但 PK 约束保证了更多的唯一性,即表中的任何两行都不能具有相同的主键值。
在 SQL Server 中,即使在语法上您可以NOT NULL
在 DDL 中命名一个约束,但它与其他约束的不同之处在于,实际上没有为约束本身存储元数据(甚至包括名称)。
CREATE TABLE T
(
X INT CONSTRAINT NotNull NOT NULL
)
我没有看到的另一点是:NULL
空字符串是两个非常不同的东西,但它们通常被社区的大部分人认为是可以互换的。
您可以将varchar
列声明为,NOT NULL
但您仍然可以这样做:
DECLARE @x TABLE(y VARCHAR(32) NOT NULL);
INSERT @x(y) VALUES('');
因此,如果您的目标是确保有一个既不是零长度字符串NULL
也不是零长度字符串的有效值,您还可以添加一个检查约束,例如
DECLARE @x TABLE(y VARCHAR(32) NOT NULL CHECK (DATALENGTH(LTRIM(y)) > 0));
NOT NULL
是字段具有值的条件。您可以强制字段始终为插入或更新的每条记录输入一个值,从而使表定义中的字段为 NOT NULL。
主键必须满足以下三个条件:
- 该字段的值不是 NULL。
- 价值观是独一无二的。
- 这些值是不可变的。
数据库可以使用唯一索引(以及字段上的非空条件)强制执行前两个条件。
第三个条件通常不会由数据库强制执行。数据库通常允许更改主键字段,因此 DBA 可以“修复”它们。所以第三个条件更具哲学性,因为您同意使用密钥进行识别,而不是编写更改值的应用程序,除非旨在让管理员修复密钥。
我这里一直使用字段,但是主键可以是复合主键,由满足条件的字段的任意组合组成。与前 2 个或所有 3 个条件匹配的任何字段组合称为候选键。
只有一个候选键可以用作主键。哪一个只是一个随意的选择。