MySql使用不同的值更新为重复列的列

时间:2017-03-06 21:30:32

标签: mysql

我有一张这样的表

CREATE TABLE IF NOT EXISTS users_groups(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT(11) UNSIGNED NOT NULL,
  name VARCHAR(250) NOT NULL,
  is_deleted BOOLEAN NOT NULL DEFAULT false,
  creation_date DATETIME NOT NULL,
  last_modification_date DATETIME NOT NULL,
  PRIMARY KEY (id)
);

我想将列(user_id,name)变为唯一,但我遇到的问题是我已经在该列中有重复项。在某些情况下,列会重复多次。

我想编写一个查询来更新连接名称中某些值的重复行,例如,对于第二个副本的第一个副本'**',请加上'*',依此类推。

这可以写一个查询吗?

我可以获得我想修改的组,但我不确定是否有可能用mysql实现我想要的

select users_groups.id, users_groups.user_id, users_groups.name
from users_groups
inner join (select user_id, name, count(*) from users_groups group by user_id, name having count(*) > 1) as u on u.user_id = users_groups.user_id
where users_groups.name = u.name;

2 个答案:

答案 0 :(得分:1)

试试这个。

SET @prev_user_id := '';
SET @prev_name := '';
SET @cnt := 0;

select s.id, s.user_id, s.name
from 
(
  select 
    users_groups.id,     
    IF(@prev_user_id <> users_groups.user_id OR @prev_name <> users_groups.name, @cnt := 0, @cnt := @cnt + 1) AS cnt,   
    CONCAT(users_groups.user_id, REPEAT('*', @cnt)) AS user_id,
    CONCAT(users_groups.name, REPEAT('*', @cnt)) AS name,  
    @prev_user_id := users_groups.user_id,
    @prev_name := users_groups.name
  from 
    users_groups
) s

点击此处: http://sqlfiddle.com/#!9/6d553/10

答案 1 :(得分:0)

我不确定这是否有帮助,但您可以创建一个唯一的列,而不必将该列作为该表的主键。

例如:

CREATE TABLE user (
    user_id NOT NULL,
    firstname varchar(255) NOT NULL,
    UNIQUE (firstname)
) 

或以下语句在多列中创建唯一约束。

CREATE TABLE user (
    user_id NOT NULL,
    firstname varchar(255) NOT NULL,
    CONSTRAINT constraint_name UNIQUE (user_id, firstname)
) 

另外,我不完全确定你为什么要识别重复项。最好完全避免重复记录和数据输入。这可以通过表规范化以及使用适当的索引来完成。

我希望这会有所帮助。