Java 是否可以修改sql中的唯一约束?
我使用unique约束来避免除null值之外的重复项,因为此列可以保持null(这不是必填字段,但它有助于通过电子邮件e.t.c进行类似搜索的搜索) 在上述情况下,选择唯一约束是否正确 备选方案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只允许一个空值,所以可以为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值(“”);