我希望对我的桌面访问者有一个约束,允许插入重复数据。但是,只有在布尔值(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)
这根本不允许插入重复的行。请帮忙。
答案 0 :(得分:0)
在这里,您试图实现动态约束,我怀疑任何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值选择在应用程序代码端使用哪一个。 虽然,第一个不会影响性能。