Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
Java 是否可以修改sql中的唯一约束?_Java_Mysql_Sql_Sqlite - Fatal编程技术网

Java 是否可以修改sql中的唯一约束?

Java 是否可以修改sql中的唯一约束?,java,mysql,sql,sqlite,Java,Mysql,Sql,Sqlite,我使用unique约束来避免除null值之外的重复项,因为此列可以保持null(这不是必填字段,但它有助于通过电子邮件e.t.c进行类似搜索的搜索) 在上述情况下,选择唯一约束是否正确 备选方案 因为unique只允许一个空值,所以可以为unique约束生成不同的默认值?每行的i-e是唯一的 您可以对生成的列使用技巧。大概是这样的: alter table t add unique_val as ( concat(coalesce(col, ''), ':', (case when c

我使用unique约束来避免除null值之外的重复项,因为此列可以保持null(这不是必填字段,但它有助于通过电子邮件e.t.c进行类似搜索的搜索)

在上述情况下,选择唯一约束是否正确

备选方案
因为unique只允许一个空值,所以可以为unique约束生成不同的默认值?每行的i-e是唯一的

您可以对生成的列使用技巧。大概是这样的:

alter table t add unique_val as
     ( concat(coalesce(col, ''), ':', (case when col is null then pk end))  ) unique;
其中,
pk
是主键列


这会将
NULL
值替换为每行上唯一的值。

您将问题标记为和,因此我将讨论这两个问题

数据库 在SQLite中,一个唯一的约束将根据您的需要工作

文件说明:

出于唯一约束的目的,空值被视为不同于所有其他值,包括其他空值

文件说明:

如果在CREATE和INDEX之间出现UNIQUE关键字,则不允许重复索引项。任何插入重复条目的尝试都将导致错误。出于唯一索引的目的,所有空值被视为不同于所有其他空值,因此是唯一的。这是SQL-92标准的两种可能解释之一(标准中的语言不明确),随后是PostgreSQL、MySQL、Firebird和Oracle。Informix和MicrosoftSQLServer遵循该标准的其他解释

但是,在大多数其他数据库中,UNIQUE约束的列不能为NULL,因此我建议使用UNIQUE索引,以保持一致性,并避免混淆

MySQL 在MySQL中,一个唯一的约束将按照您的需要工作

文件说明:

UNIQUE
索引允许对可以包含
NULL
的列使用多个
NULL

唯一键是唯一索引的同义词

SQL Server 正如SQLite文档中提到的,Microsoft SQL Server对唯一索引的NULL处理采用不同的解释

文件说明:

在唯一索引中使用的列应设置为NOTNULL,因为当创建唯一索引时,多个空值被视为重复

要解决这个问题,请使用过滤索引,例如

CREATE UNIQUE INDEX Person\u电子邮件
当面(电子邮件)
电子邮件不为空;

如果您希望允许重复使用
NULL
并且正在使用MySQL,则唯一约束不能满足您的要求。电子邮件可以是null@Coder1是的,但过滤后的索引排除了这些记录,因此允许多个记录包含空电子邮件,由于这些记录已从索引中筛选出来。在电子邮件列上创建唯一索引后,它会显示:-------------------------------------对数据库“唯一”执行SQL查询时出错:唯一约束失败:path.Emial.Results根据sqlite.INSERT-INTO-path值(“”);