在 MSSQL 中更新之前检查是不是存在唯一值

Posted

技术标签:

【中文标题】在 MSSQL 中更新之前检查是不是存在唯一值【英文标题】:Check if unique value exists before updating in MSSQL在 MSSQL 中更新之前检查是否存在唯一值 【发布时间】:2014-02-28 17:46:53 【问题描述】:

我有一个包含 MAC 地址列表的表格,在某些情况下已填充到十二位数字,而在其他情况下则没有。

即:00FF12345678 或 FF12345678

在某些情况下,此表中同时存在这两个值。我有一个用两个零填充值的函数,我可以计算这些重复项的出现次数,但我没有时间或耐心手动删除重复项或填充那些还没有记录的重复项。

我想我可以使用以下语句将 10 位数的值更新为正确的值:

UPDATE [rs_DEVICES]
SET [device] = dbo.pad_zero(12,[device])
WHERE LEN([device]) < 12

当然这不起作用,因为我只需要更新那些没有现有 12 位记录的值。此列的唯一约束阻止了我这样做。

我需要在 WHERE 子句中使用某种 IF EXISTS 语句,但我无法提出任何可行的方法。

使用 MSSQL Server 2008 R2。

想法?

【问题讨论】:

在列上添加唯一索引 【参考方案1】:

这可以为您完成工作:

UPDATE [rs_DEVICES]
SET [device] = dbo.pad_zero(12,[device])
WHERE LEN([device]) < 12 AND NOT EXISTS (
    SELECT 1 FROM rs_DEVICES r1 WHERE r1.device = dbo.pad_zero(12,[device])
)

我认为这是不言自明的,但如果您有任何问题,请发表评论。

老实说,我建议您解决真正的问题。将当前对length=10 记录的引用重新分配给它们各自的length=12 同级,然后删除它们。

【讨论】:

我同意,尽管此字段的唯一约束阻止我将 10 个字符的值更新为 12 个字符,因为这最终会创建重复项。将非重复记录转换为 12 个字符后,我现在可以轻松删除它们的 10 位对应项 :) 这就是我的意思。首先,将所有 FK 重新分配给正确的记录,然后删除 length=10 记录。无需更新此案例。

以上是关于在 MSSQL 中更新之前检查是不是存在唯一值的主要内容,如果未能解决你的问题,请参考以下文章

如何在迭代值之前检查 jq 中是不是存在“键”

PHP在更新SQL表之前检查文件是不是存在

在搜索值之前检查视图中是不是存在列

在显示 HTML 之前检查 JS 值是不是存在

如何在 CodeIgniter 中检查多个值是不是唯一

Redux reducer,检查状态数组中是不是存在值并更新状态