对数据库中表的唯一条目

时间:2015-02-18 13:56:26

标签: sql-server database unique

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

我们的数据库包含名为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中的唯一性。 新插入的值在两个表中应该是唯一的。

enter image description here

3 个答案:

答案 0 :(得分:0)

也许是这样的:

  

从表1中选择uid   存在的地方(   SELECT从FROM2中删除   在哪里Table1.uid = rid)

这将显示Table1中的所有行,其列uid在表2中的列中具有等效值。

答案 1 :(得分:0)

插入前的情况可能如下所示。 @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

答案 2 :(得分:0)

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

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

  • 取代触发器