SQL - 如果布尔值设置为true,则允许插入重复行

时间:2017-03-27 09:33:21

标签: sql sql-server constraints unique

我希望对我的桌面访问者有一个约束,允许插入重复数据。但是,只有在布尔值(IsUnique)设置为true时才允许这样做。

E.g。 (在>之后每个插入的预期结果):

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)

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

2 个答案:

答案 0 :(得分:0)

数据完整性 - RDBMS核心主体

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

解决方案

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

如果isUnique为true,那么如果副本存在则需要以编程方式检查,否则无论如何都需要插入。

答案 1 :(得分:0)

您可以将完整性检查从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值选择在应用程序代码端使用哪一个。 虽然,第一个不会影响性能。