Database 唯一密钥约束问题-MySQL、SQL Server、Oracle、Postgres

Database 唯一密钥约束问题-MySQL、SQL Server、Oracle、Postgres,database,Database,我有一个employee表,它有10列,必须为id、name、address和mobile创建一个唯一的键约束 在上述情况下,地址可能为空,手机可能为空。然而,当它们出现时,应保持其独特性 首先,我通过组合上述所有关键点创建了一个唯一的约束,并观察到以下情况 MySQL中的实际行为 001-Thiagu-NULL-900000 - Accepted 001-Thiagu-NULL-900000 - Accepted 001-Thiagu-0001-900000 - Accept

我有一个employee表,它有10列,必须为id、name、address和mobile创建一个唯一的键约束

在上述情况下,地址可能为空,手机可能为空。然而,当它们出现时,应保持其独特性

首先,我通过组合上述所有关键点创建了一个唯一的约束,并观察到以下情况

MySQL中的实际行为

   001-Thiagu-NULL-900000 - Accepted
   001-Thiagu-NULL-900000 - Accepted
   001-Thiagu-0001-900000 - Accepted
   001-Thiagu-0001-900000 - Rejected - Duplicate Record
所有数据库中的预期行为

   001-Thiagu-NULL-900000 - Accepted
   001-Thiagu-NULL-900000 - Rejected - Duplicate Record
   001-Thiagu-0001-900000 - Accepted
   001-Thiagu-0001-900000 - Rejected - Duplicate Record
基本上,无论值是否为NULL,都应考虑相似的重复

为了克服这个问题,我放弃了通过向unique约束添加列来组合和创建unique的想法,并提出了一个具有unique约束的字符串类型的新列

我手动构造的记录的每个插入都有一个,并在任何插入上给出值,以便保持唯一性

这是否是正确的方法,或者是我不确定的上述第一种方法中的任何其他解决方法


所创建的约束应适用于MySQL、SQL Server、Oracle和Postgres。

在SQL中,null从不等于null。这不是一个bug,这是一个特性。NULL与NULL不区分为true,但键声明使用“=”[在等效的longhands中],NOT与NULL不区分。您希望使用的“key”约束与其他约束没有区别,因此无法通过声明key来实现

下一个选项是检查约束,但产品不太可能支持访问除插入行以外的其他行的检查约束

下一个选项是创建断言,但没有任何产品[可靠地]支持该断言,这与它们不支持交叉行检查约束的原因基本相同

下一个选项是在存储过程中强制执行这一点,但是您可能会碰到[某些]只使用其专有方言SQL/PSM语言的产品


下一个选项是应用程序代码。

在SQL中,null从不等于null。这不是一个bug,这是一个特性。NULL与NULL不区分为true,但键声明使用“=”[在等效的longhands中],NOT与NULL不区分。您希望使用的“key”约束与其他约束没有区别,因此无法通过声明key来实现

下一个选项是检查约束,但产品不太可能支持访问除插入行以外的其他行的检查约束

下一个选项是创建断言,但没有任何产品[可靠地]支持该断言,这与它们不支持交叉行检查约束的原因基本相同

下一个选项是在存储过程中强制执行这一点,但是您可能会碰到[某些]只使用其专有方言SQL/PSM语言的产品


下一个选项是应用程序代码。

请(通过单击下面的链接)提出问题,并为相关表添加CREATE TABLE语句,包括所有索引和约束。请您的问题不会在注释中发布代码。如果您在搜索框中键入“sql null in unique key”,则您将得到一个包含大量条目的列表,这些条目可能已经回答了您的问题:。我想说的是,我自己也在列表中,在。是的,正在寻找一种适用于上述所有四种数据库产品的解决方案请简化您的问题(通过单击下面的链接),并为所讨论的表添加CREATE TABLE语句,包括所有索引和约束。请您的问题不会在注释中发布代码。如果您在搜索框中键入“sql null in unique key”,则您将得到一个包含大量条目的列表,这些条目可能已经回答了您的问题:。我想说的是,我自己也在列表中,在。是的,正在寻找一种解决方案,该解决方案适用于上述所有四种数据库产品