我已经看过一些网络搜索和对此的回复,但似乎它们都涉及视图。
如何调整列以使其仅允许NULL或唯一值?
在我的情况下,有一个包含库存商品的表格,其中只有服务器商品有序列号。其余的都是空的。我想对进入相同的连续剧实施某种控制。
此外,我无法重新设计架构,因为我正在为静态网站编写新的前端。
答案 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)
请注意,您需要在视图而不是表格上执行INSERT
和UPDATE
。
您可以使用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