Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更改表列以添加约束,其中列不为null_Sql_Postgresql - Fatal编程技术网

Sql 更改表列以添加约束,其中列不为null

Sql 更改表列以添加约束,其中列不为null,sql,postgresql,Sql,Postgresql,我有这个: alter table supplier add constraint supplier_unique unique (supplier_id) where supplier_id is not null; 但是我犯了一个错误 由此产生的定义应为: CREATE UNIQUE INDEX supplier_unique ON supplier (supplier_id) WHERE (supplier_id IS NOT NULL) 谢谢。PostgreSQL中的A没有WHERE

我有这个:

alter table supplier
add constraint supplier_unique
unique (supplier_id) where supplier_id is not null;
但是我犯了一个错误

由此产生的定义应为:

CREATE UNIQUE INDEX supplier_unique
ON supplier (supplier_id) WHERE (supplier_id IS NOT NULL)
谢谢。

PostgreSQL中的A没有WHERE子句,因此在“WHERE”处出现语法错误。在任何情况下,
supplier\u id不为空
不需要具有唯一约束:

通常,当表中有多行且约束中包含的所有列的值相等时,将违反唯一约束。但是,在这种比较中,两个空值并不相等。这意味着即使存在唯一约束,也可以在至少一个受约束列中存储包含空值的重复行。此行为符合SQL标准

因此,您所需要的是:

alter table supplier
add constraint supplier_unique
unique (supplier_id);
将添加您的唯一约束,您可以有多行
供应商\u id为NULL
,并且您将获得索引作为唯一约束的副作用

但是,如果要直接创建索引,可以使用谓词:

当WHERE子句存在时,将创建一个部分索引。部分索引是只包含表的一部分的条目的索引,通常是比表的其余部分更有用的索引部分。
[…]
另一个可能的应用程序是使用WHERE with UNIQUE在表的子集上强制唯一性

但是在空值的情况下,
supplier\u id的部分索引不是空的
对唯一性没有任何作用,因为PostgreSQL的唯一性约束已经允许多个空值(可能是因为标准的原因,并且因为
x=NULL
对于所有
x
都是假的)

因此,如果您的目的是将唯一性限制为非空值,那么您不需要部分索引;但是,若您只是想避免索引空值,那个么您可以通过创建索引(而不是ALTERTABLE)来实现。不过,我不知道在索引中保留空值是否会有任何明显的效果

我认为(你的和我的)困惑的一部分是,UNIQUE既是一个约束又是一个索引。可以在将其创建为索引时包含WHERE,但在将其创建为约束时不包含WHERE。这肯定是不一致的。

A在PostgreSQL中没有WHERE子句,因此在“WHERE”处出现语法错误。在任何情况下,
supplier\u id不为空
不需要具有唯一约束:

通常,当表中有多行且约束中包含的所有列的值相等时,将违反唯一约束。但是,在这种比较中,两个空值并不相等。这意味着即使存在唯一约束,也可以在至少一个受约束列中存储包含空值的重复行。此行为符合SQL标准

因此,您所需要的是:

alter table supplier
add constraint supplier_unique
unique (supplier_id);
将添加您的唯一约束,您可以有多行
供应商\u id为NULL
,并且您将获得索引作为唯一约束的副作用

但是,如果要直接创建索引,可以使用谓词:

当WHERE子句存在时,将创建一个部分索引。部分索引是只包含表的一部分的条目的索引,通常是比表的其余部分更有用的索引部分。
[…]
另一个可能的应用程序是使用WHERE with UNIQUE在表的子集上强制唯一性

但是在空值的情况下,
supplier\u id的部分索引不是空的
对唯一性没有任何作用,因为PostgreSQL的唯一性约束已经允许多个空值(可能是因为标准的原因,并且因为
x=NULL
对于所有
x
都是假的)

因此,如果您的目的是将唯一性限制为非空值,那么您不需要部分索引;但是,若您只是想避免索引空值,那个么您可以通过创建索引(而不是ALTERTABLE)来实现。不过,我不知道在索引中保留空值是否会有任何明显的效果


我认为(你的和我的)困惑的一部分是,UNIQUE既是一个约束又是一个索引。可以在将其创建为索引时包含WHERE,但在将其创建为约束时不包含WHERE。这肯定是不一致的。

MSSQL将抛出一个重复的键错误,如果您在一个可为空的列中插入多个null。MSSQL2008增加了对的支持。@gordy:(1)这与标准相反,而且,IMHO,有点愚蠢,(2)这是关于PostgreSQL的。目标是让
供应商id
为空,但当输入它的值时,它必须是唯一的。@Victor:这就是唯一约束在PostgreSQL中的作用,值必须是不同的w.r.t.
=
,因为
x=NULL
对于所有
x
都是false,所以可以有多个NULL值。刚刚注意到pg标签。是的,MSSQL是各种各样的哑巴。mu对于唯一约束是完全正确的,“where supplier_id not null”在这里是不必要的(除非您使用的是MSSQL)。如果您在可空列中插入多个null,MSSQL将抛出重复的键错误。MSSQL2008增加了对的支持。@gordy:(1)这与标准相反,而且,IMHO,有点愚蠢,(2)这是关于PostgreSQL的。目标是让
供应商id
为空,但当输入它的值时,它必须是唯一的。@Victor:这就是唯一约束在PostgreSQL中的作用,值必须是不同的w.r.t.
=
,因为
x=NULL
对于所有
x
都是false,所以可以有多个NULL值。刚刚注意到pg标签。是的,MSSQL是各种各样的哑巴。mu对于唯一约束是完全正确的,“where supplier_id not null”在这里是不必要的(除非您使用的是MSSQL),这可能是您想要的