数据库中表的唯一条目

Unique entries over to tables in database

我遇到一个问题,我需要检查数据库中每个 table 中的两列是否唯一。

我们的数据库包含名为 uid 和 rid 的条形码条目。

Table 1: T1.uid 和 Table 2: T2.rid 两个 table 列中的条形码不能相同。 我们如何确保这一点。 如果在 table T1.uid 中插入条形码与 T2.rid 我们想抛出一个错误。

table 已清理并处于一致状态,其中条目在 T1.uid 和 T2.rid 在两个 table 列中都是唯一的。

无法在 table 各自的 uid 和 tid 列(T1.uid 和 T2.rid)中插入 NULL 值

无法为所有条形码创建新的 table。 因为我们没有数据库服务器的完全控制权。

编辑 19-02-2015

这个解决方案对我们不起作用,因为我们无法制作新的 table 跟踪唯一名称(参见 table 插图)。 我们希望在不更改架构的情况下对不同 table 中的两列进行约束。

根据插图,我们想让 john 不可能存在于 T2 因为他已经存在于 table T1 中。所以必须“抛出”一个错误 当我们尝试在 T2.Name.

中插入 John 时

原因是我们有不同的供应商插入这些 tables 以不同的方式,如果我们改变架构布局,所有供应商都会 需要更改他们的数据库查询。总的工作量太大了, 如果我们强迫每个供应商做出改变。 所以我们需要一些不引人注目的东西,不需要供应商改变 他们的代码。

例如 T1.Name 是唯一的,不接受 NULL 值。 如果我们尝试插入一个现有的名字,比如“Alan”,那么就会发生异常 因为该列具有唯一值。

但我们想同时检查 T2.Name 中的唯一性。 新插入的值在两个 table 中应该是唯一的。

也许是这样的:

SELECT uid FROM Table1 Where Exists ( SELECT rid FROM Table2 WHERE Table1.uid = rid )

这将显示 Table1 中的所有行,其中它们的列 uid 在 table2 的列中具有等效项。

插入发生之前的情况可能如下所示。 @Id是您需要为其插入数据的id。

DECLARE @allowed INT;

SELECT @allowed = COUNT(*)
FROM
(
SELECT T1.uid FROM T1 WHERE T1.uid = @Id
UNION ALL
SELECT T2.rid FROM T2 WHERE T2.rid = @id
)
WHERE
 @id IS NOT NULL;

IF @allowed = 0 
BEGIN
  ---- insert allowed
  SELECT 0;
END

感谢所有回答的人。 我已经解决了这个问题。触发器被添加到数据库 每次执行插入或更新过程时,我们都会捕获它 检查要插入的值是否存在于两个列中 表。如果该检查成功,我们将执行原始查询。 否则我们回滚查询。

http://www.codeproject.com/Articles/25600/Triggers-SQL-Server

  • 代替触发器