确保列中的值不同

时间:2012-06-27 14:05:51

标签: mysql sql database stored-procedures stored-functions

我有一个包含列的表,其值不应相同。由于执行不佳,软件不检查以确保用户是否输入了副本,因此我被委以编写“简单”sql语句或函数的任务,该语句或函数将查看列中的所有值并确保它们不是相同。 sql本身将每月执行一次,因此它不一定非常有效。

列存储int并且我想增加其中一个重复值,并且每次都继续这样做,直到表中没有更多的条目具有相同的列值。有什么建议我该怎么办?我不确定从哪里开始。

感谢任何人的洞察力。

编辑:抱歉忘记提及数据中不重复的值应保持这种状态。这些是用于客户的设置,我们应该在它们具有重复值时惩罚它们。如果他们不这样做,那么我们就不应该破坏他们的设置,否则他们会生气。

它只是一个表,包含很多列,但是这个特定的列特别是int类型并且从不包含任何空值,不应该有任何重复。

3 个答案:

答案 0 :(得分:1)

要了解问题的大小,请尝试以下内容,它是Oracle语法,因为我不知道mysql但应该有一个等效的。

SELECT your_col, COUNT(your_col)
  FROM your_table
 GROUP BY your_col

我真的不认为当你发现重复时增加一个值是你要走的路,你可能会在解析第一个时创建另一个副本,有效地在每个增量之后你必须从头开始再次检查。正确的方法是为用于输入数据的任何内容添加验证以拒绝任何重复项。那么至少你只需要清理一次数据。

对不起,如果这不是你所希望的: - )

ETA你的公司错了,每周运行一次sql不会便宜,至少从长远来看是这样。你在需要缝线的东西上贴了一块石膏。现在更好地接受命中并解决潜在的问题,一开始,一个不想要任何重复的列,但仍允许输入它们?有一个majot WTF开始。

答案 1 :(得分:1)

 create table tableName (KeyCol int identity(1,1), intCol int)
 insert into tableName values (1), (2), (2), (3), (5), (6), (5), (7), (9)


While exists (
    select intCol
    from tableName
    group by intCol
    having count(*) > 1
)
begin

    declare @newValue int

    select @newValue = min(t1.intCol) + 1
    from tableName t1
    left join tableName t2
    on t1.intCol + 1 = t2.intCol
    where t2.intCol is null

    update tx
    set intCol = @newValue
    from tableName tx
    where intCol = 
    (select top 1 intCol
    from tableName t1
    group by intCol
    having count(*) > 1
    order by intCol)
    and KeyCol = (select min(KeyCol) from tableName t2 where t2.intCol = tx.intCol)
end

select * from tableName order by 2

答案 2 :(得分:0)

为什么不删除此列并使用唯一数据重新创建或重新填充它并将其放在UNIQUE INDEX上?