我有一张这样的表
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;
答案 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
答案 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)
)
另外,我不完全确定你为什么要识别重复项。最好完全避免重复记录和数据输入。这可以通过表规范化以及使用适当的索引来完成。
我希望这会有所帮助。