1

哪个约束确保一列输入了一些值?我在主键和非空约束之间感到困惑。

4

3 回答 3

3

一个NOT NULL约束。

参与 PK 的所有列也必须不允许NULL,但 PK 约束保证了更多的唯一性,即表中的任何两行都不能具有相同的主键值。

在 SQL Server 中,即使在语法上您可以NOT NULL在 DDL 中命名一个约束,但它与其他约束的不同之处在于,实际上没有为约束本身存储元数据(甚至包括名称)。

CREATE TABLE T
(
X INT CONSTRAINT NotNull NOT NULL
)
于 2013-03-10T21:00:53.410 回答
1

我没有看到的另一点是: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));
于 2013-03-10T21:45:57.553 回答
0
NOT NULL

是字段具有值的条件。您可以强制字段始终为插入或更新的每条记录输入一个值,从而使表定义中的字段为 NOT NULL。

主键必须满足以下三个条件:

  1. 该字段的值不是 NULL。
  2. 价值观是独一无二的。
  3. 这些值是不可变的。

数据库可以使用唯一索引(以及字段上的非空条件)强制执行前两个条件。

第三个条件通常不会由数据库强制执行。数据库通常允许更改主键字段,因此 DBA 可以“修复”它们。所以第三个条件更具哲学性,因为您同意使用密钥进行识别,而不是编写更改值的应用程序,除非旨在让管理员修复密钥。

我这里一直使用字段,但是主键可以是复合主键,由满足条件的字段的任意组合组成。与前 2 个或所有 3 个条件匹配的任何字段组合称为候选键。

只有一个候选键可以用作主键。哪一个只是一个随意的选择。

于 2013-03-10T21:10:43.823 回答