如何解决SQL约束在两列中具有一个唯一值
| 我需要确保一个值在两列中是唯一的(这不是“两列”索引问题)。Table A
Column A1 Column A2
Memphis New York -> ok
San Francisco Miami -> ok
Washington Chicago -> ok
Miami Las Vegas -> Forbidden ! Miami already exists
可能吗 ?
我的例子是在城市,但不专注于此。我真正的需要是关于生成的十六进制ID。
解决方法
您需要添加一个约束触发器,以便在插入/更新后对其进行查找。
, 在SQL Server中,可以借助索引视图来强制执行唯一性。您还需要在与
Table A
相同的数据库中需要一个数字表(如果还没有)。
这是我的测试脚本,带有一些注释:
CREATE TABLE MyNumbersTable (Value int);
-- You need at least 2 rows,by the number of columns
-- you are going to implement uniqueness on
INSERT INTO MyNumbersTable
SELECT 1 UNION ALL
SELECT 2;
GO
CREATE TABLE MyUniqueCities ( -- the main table
ID int IDENTITY,City1 varchar(50) NOT NULL,City2 varchar(50) NOT NULL
);
GO
CREATE VIEW MyIndexedView
WITH SCHEMABINDING -- this is required for creating an indexed view
AS
SELECT
City = CASE t.Value -- after supplying the numbers table
WHEN 1 THEN u.City1 -- with the necessary number of rows
WHEN 2 THEN u.City2 -- you can extend this CASE expression
END -- to add more columns to the constraint
FROM dbo.MyUniqueCities u
INNER JOIN dbo.MyNumbersTable t
ON t.Value BETWEEN 1 AND 2 -- change here too for more columns
GO
-- the first index on an indexed view *must* be unique,-- which suits us perfectly
CREATE UNIQUE CLUSTERED INDEX UIX_MyIndexedView ON MyIndexedView (City)
GO
-- the first two rows insert fine
INSERT INTO MyUniqueCities VALUES (\'London\',\'New York\');
INSERT INTO MyUniqueCities VALUES (\'Amsterdam\',\'Prague\');
-- the following insert produces an error,because of \'London\'
INSERT INTO MyUniqueCities VALUES (\'Melbourne\',\'London\');
GO
DROP VIEW MyIndexedView
DROP TABLE MyUniqueCities
DROP TABLE MyNumbersTable
GO
有用的读物:
创建索引视图
\“ Numbers \”或\“ Tally \”表:它是什么以及如何替换循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。