【问题标题】:SQL - Permit insertion of duplicate rows if a boolean is set to true [duplicate]SQL - 如果布尔值设置为 true,则允许插入重复行 [重复]
【发布时间】:2017-03-27 09:33:20
【问题描述】:

我想对我的表 Visitor 设置一个允许插入重复数据的约束。但是,只有在布尔值 (IsUnique) 设置为 true 时才允许这样做。

例如(在 --> 之后每次插入的预期结果):

INSERT INTO Visitor (FirstName, LastName, IsUnique) VALUES ('John', 'Doe', 'True') --> ok
INSERT INTO Visitor (FirstName, LastName, IsUnique) VALUES ('John', 'Doe', 'True') --> not ok. already exists
INSERT INTO Visitor (FirstName, LastName, IsUnique) VALUES ('John', 'Doe', 'False') --> ok. IsUnique is set to false
INSERT INTO Visitor (FirstName, LastName, IsUnique) VALUES ('John', 'Doe', 'False') --> also ok because IsUnique is set to false

这是我目前想出的:

ALTER TABLE Visitor ADD CONSTRAINT CT_UniqueVisitor UNIQUE NONCLUSTERED (Title, Firstname, Lastname, Company, IsUnique)

这根本不允许插入重复的行。请帮忙。

【问题讨论】:

  • 这是为 oracle 准备的吗?
  • 标记您的数据库
  • 你的四个插入是一个例子还是两个例子?我们是否允许John, Doe, FalseJohn, Doe, True 这两个行?
  • 用于 mssql。很抱歉没有提到这一点。这四个插件是一个示例。如果为 True,则不应有任何其他具有相同值的行。如果允许虚假重复
  • 这个问题毫无意义。如果记录是真正的重复,其中N-1 是多余的,并且没有向现有记录添加任何信息,那么为什么要允许它们存在呢?如果它们重复,则您的主键定义错误(因为并非所有非键列都依赖它)

标签: sql sql-server constraints unique


【解决方案1】:

数据完整性 - RDBMS 核心主体

在这里,您正在尝试实现动态约束,我怀疑任何 RDBMS 都会支持这一点,因为任何 RDBMS 数据库都以数据完整性作为其核心原则,并且数据约束是根据应用程序的特定需求定义的。

解决方案

为了解决您的问题,我宁愿在 INSERT 上创建一个触发器,该触发器在插入数据之前触发,它会检查此字段是真还是假。

如果 isUnique 为真,则需要以编程方式检查是否存在重复项,否则仍允许插入。

【讨论】:

  • 与您的疑问相反,许多数据库系统都有一些方法可以实现子集检查(例如SQL Server的filtered indexs,Postgre的partial indexs,我相信可以通过函数来​​完成一些事情Oracle 等基于索引的索引)。这些可能是合适的,但要知道它们是否合适,或者要采取哪种具体方法,我们需要 OP 在他们的问题中更加明确,包括确定他们正在使用哪个数据库系统(因为每种方法都是特定于供应商的)
【解决方案2】:

您可以将完整性检查从 RDBMS 移到代码中。 考虑两个查询:

INSERT INTO Visitor (FirstName, LastName, IsUnique) 
SELECT * FROM ('John', 'Doe', 'True') AS tmp
WHERE NOT EXISTS (
    SELECT FirstName, LastName FROM Visitor 
    WHERE FirstName= 'John'
     AND LastName = 'Doe'
) LIMIT 1;


INSERT INTO Visitor (FirstName, LastName, IsUnique) VALUES ('John',
'Doe', 'False')

您将根据 IsUnique 值选择在应用程序代码端使用哪一个。 虽然,第一个不会影响性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多