数据库中表的唯一条目
Posted
技术标签:
【中文标题】数据库中表的唯一条目【英文标题】:Unique entries over to tables in database 【发布时间】:2015-02-18 13:56:26 【问题描述】:我有一个问题,我需要检查数据库中每个表中的两列是否唯一。
我们有一个名为 uid 和 rid 的带有条形码条目的数据库。
表 1:T1.uid 和 表 2:T2.rid 两个表格列中的条形码不得相同。 我们如何确保这一点。 如果将条码插入表 T1.uid 与表中的条目匹配 T2.rid 我们要抛出一个错误。
表已清理并处于一致状态,其中条目 T1.uid 和 T2.rid 在两个表列中都是唯一的。
无法在表中的相应 uid 和 tid 列(T1.uid 和 T2.rid)中插入 NULL 值
不可能为所有条形码创建新表。 因为我们无法完全控制数据库服务器。
编辑 19-02-2015
此解决方案对我们不起作用,因为我们无法创建新表 跟踪唯一名称(见表插图)。 我们希望在不更改架构的情况下对不同表中的两列进行约束。
根据插图,我们想让约翰不可能存在于 T2 因为他已经存在于表 T1 中。所以必须“抛出”一个错误 当我们尝试在 T2.Name 中插入 John 时。
原因是我们有不同的供应商插入到这些表中 以不同的方式,如果我们改变模式布局,所有供应商都会 需要更改他们的数据库查询。总的工作就是这么多, 如果我们强迫每个供应商做出改变。 所以我们需要一些不引人注目的东西,不需要供应商改变 他们的代码。
例如 T1.Name 是唯一的并且不接受 NULL 值。 如果我们尝试插入一个现有的名字,比如“Alan”,那么就会发生异常 因为该列具有唯一值。
但我们想同时检查 T2.Name 中的唯一性。 新插入的值在两个表中应该是唯一的。
【问题讨论】:
数据是如何进入数据库的?因为有很多方法可以处理这个问题,并且取决于它是通过数据处理导入还是通过应用程序输入 - 那么更好的解决方案可能会有所不同。 SQL Unique constraint across multiple tables 的可能重复项 不是重复的,链接不能解决问题,找到解决方案的答案在下面的答案中描述。 【参考方案1】:可能是这样的:
从表 1 中选择 uid 存在的地方( 从表 2 中选择摆脱 WHERE Table1.uid = 摆脱)
这将显示 Table1 中的所有行,其中它们的列 uid 在 Table2 的列中具有等效项。
【讨论】:
【参考方案2】:插入发生之前的条件可能如下所示。 @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
【讨论】:
【参考方案3】:感谢所有回答的人。 我已经解决了这个问题。将触发器添加到数据库 每次执行插入或更新过程时,我们都会捕获它 检查要插入的值是否不存在于两者的列中 表。如果该检查成功,我们将执行原始查询。 否则我们回滚查询。
http://www.codeproject.com/Articles/25600/Triggers-SQL-Server
代替触发器【讨论】:
以上是关于数据库中表的唯一条目的主要内容,如果未能解决你的问题,请参考以下文章