如何使列允许null或唯一的序列

时间:2009-05-28 15:01:44

标签: sql sql-server

我已经看过一些网络搜索和对此的回复,但似乎它们都涉及视图。

如何调整列以使其仅允许NULL或唯一值?

在我的情况下,有一个包含库存商品的表格,其中只有服务器商品有序列号。其余的都是空的。我想对进入相同的连续剧实施某种控制。

此外,我无法重新设计架构,因为我正在为静态网站编写新的前端。

8 个答案:

答案 0 :(得分:6)

在MySQL中,同样可以为空的UNIQUE列允许任意数量的空值(在所有引擎中)。因此,如果您使用的是MySQL,只需在感兴趣的列中添加UNIQUE约束即可。这种行为是SQL标准,PostgreSQL和SQLite也支持这种行为(显然只有Oracle用于单列UNIQUE约束,但我无法证实这一点。)

但是,此SQL标准行为不一定适用于所有其他RDBMS引擎,例如SQL Server或DB2;如果您指定需要支持的引擎,我们可能会提供更具体的建议。

答案 1 :(得分:4)

SQL Server允许创建接受UNIQUE值的NULL索引,但这需要一点技巧。

创建一个仅选择非NULL列并在视图上创建UNIQUE INDEX的视图:

CREATE VIEW myview
AS
SELECT  *
FROM    mytable
WHERE   mycolumn IS NOT NULL

CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn)

请注意,您需要在视图而不是表格上执行INSERTUPDATE

您可以使用INSTEAD OF触发器执行此操作:

CREATE TRIGGER trg_mytable_insert ON mytable
INSTEAD OF INSERT
AS
BEGIN
        INSERT
        INTO    myview
        SELECT  *
        FROM    inserted
END

答案 2 :(得分:2)

如果您使用的是MS SQL Server 2008 ,则可以使用过滤的唯一索引来实现此目的。有关详细信息,请查看this forum thread

答案 3 :(得分:0)

你能从前端验证吗?在插入或提交数据之前,请确保它是唯一的或NULL。

答案 4 :(得分:0)

你可以用触发器代替......

索引列但没有唯一约束 允许空值 在INSERT和UPDATE上的表上粘贴一个触发器,检查您尝试插入的列值是否为NULL或表中是否已存在

答案 5 :(得分:0)

我不知道你正在使用什么数据库,但在Postgres中,你可以定义一个“before insert or update”触发器,它可以返回一个特殊值来拒绝插入。如果没有本地方法,可以使用它来强制执行这样的约束。

答案 6 :(得分:0)

这是为什么平台?

对于SQL Server,请参阅此blog post,其中显示了使用索引视图的技术。

答案 7 :(得分:0)

对于Sql Server 2008,这里是由MattB链接的过滤索引解决方案的副本。我在这里写它是为了确保人们不要错过它:

CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls]
ON [Customers] (SSN)
WHERE [SSN] IS NOT NULL