我希望对我将使用GUID填充的列具有唯一约束.但是,我的数据包含此列的空值.如何创建允许多个空值的约束?
这是一个示例场景.考虑这个架构:
CREATE TABLE People (
Id INT CONSTRAINT PK_MyTable PRIMARY KEY IDENTITY,
Name NVARCHAR(250) NOT NULL,
LibraryCardId UNIQUEIDENTIFIER NULL,
CONSTRAINT UQ_People_LibraryCardId UNIQUE (LibraryCardId)
)
Run Code Online (Sandbox Code Playgroud)
然后看看我正在尝试实现的代码:
-- This works fine:
INSERT INTO People (Name, LibraryCardId)
VALUES ('John Doe', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA');
-- This also works fine, obviously:
INSERT INTO People (Name, LibraryCardId)
VALUES ('Marie Doe', 'BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB');
-- This would *correctly* fail:
--INSERT INTO People (Name, LibraryCardId)
--VALUES ('John Doe the Second', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA');
-- This works fine this one first time: …Run Code Online (Sandbox Code Playgroud) 以下是包含3列的示例表(ID,UNIQUE_VALUE,UNIQUE_GROUP_ID)
我希望以下记录可以被允许:
(1, NULL, NULL)
(2, NULL, NULL)
Run Code Online (Sandbox Code Playgroud)
要么
(3, NULL, 7)
(4, 123, 7)
Run Code Online (Sandbox Code Playgroud)
或(注:此条件中不允许unique index,也没有unique constraint)
(5, NULL, 7)
(6, NULL, 7)
Run Code Online (Sandbox Code Playgroud)
这些是不允许的:
(7, 123, 7)
(8, 123, 7)
Run Code Online (Sandbox Code Playgroud)
我在最后2列创建了一个唯一索引,但只允许前两个示例.
是否可以让db只在两者都不为空时检查这两列的唯一性?
我在SO上遇到了这个例子,它给出了一个通过忽略空值来创建唯一索引的解决方案.但是,我想扩展它,我无法达成解决方案.
我有一个表的3列的复合索引(表中还有其他10列).这些列不是PK的一部分.在这3列中,2将始终保留一些值,第3列可能为NULL.我有大量的测试数据,并且有许多插入,其中2列具有相同的值,第3列为NULL.这些所有插件都适用于PostgreSQL,但Oracle抱怨道.为了让我的测试用例工作,我认为我认为最简单的解决方案是尝试一个独特的Oracle索引,它可以在PostgreSQL中运行.
确切地说:我想要一种以下类型的结构,不确定如何结合 col1 + col2 + col3
create unique index tbl_idx on tbl (nvl2(col3, col1 + col2, col1 + col2 + col3))
Run Code Online (Sandbox Code Playgroud)
我正在使用liquibase.索引以下列方式创建 -
<changeSet dbms="postgresql,oracle" author="abc" id="222">
<createIndex indexName="Index_7" schemaName="ss" tableName="Users" unique="true">
<column name="idOrganization"/>
<column name="strUsername"/>
<column name="strNotDeleted"/>
</createIndex>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
我使用liquibase来创建我的测试数据,这里有两个插入语句
<insert schemaName="ss" tableName="Users">
<column name="strUsername" value="user1" />
<column name="idUser" valueNumeric="20741" />
<column name="idOrganization" valueNumeric="4" />
<column name="strFirstName" value="user" />
<column name="strLastName" value="one" />
<column name="strEmail" value="email@foo.com" />
<column name="strNotDeleted" />
</insert>
<insert schemaName="ss" tableName="Users">
<column …Run Code Online (Sandbox Code Playgroud)