数据库中表的唯一条目
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
- 代替触发器
我遇到一个问题,我需要检查数据库中每个 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
- 代替触发器