MySQL数据库重复

时间:2011-08-31 16:47:39

标签: mysql duplicates

而不是解释整个情况,这只会增加问题的混乱,我刚刚决定采用一个非常简单的表格示例并在下面问我的问题

我有一个数据库表,看起来像这样:

    product_id | category_id | category_name
         1            1           Cat One
         2            2           Cat One
         3            3           Cat One
         4            4           Cat Two
         4            5           Cat Two

如何将第二行和第三行设置为与第一行具有相同的category_id?所以它看起来像:

    product_id | category_id | category_name
        1             1            Cat One
        2             1            Cat One
        3             1            Cat One
        4             4            Cat Two
        5             4            Cat Two

请记住,我需要为12,474行执行此操作! :(

我一直在用桌子砸桌子好几个小时。任何想法都会受到大力赞赏

谢谢,安迪

P.S:我忘了添加category_id应该是相同的,因为category_name是所有人的Cat One

编辑2:编辑表格样本以避免混淆

5 个答案:

答案 0 :(得分:1)

创建一个表格,将每个类别名称映射到一个id

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) SELECT NULL as id, `category_name` as name FROM `tableName` GROUP BY `category_name`

然后UPDATE一切

UPDATE `tableName`, `categories` 
  SET `tableName`.`category_id` = `categories`.`id` 
  WHERE `tableName`.`category_name` = `categories`.`name`

然后删除categories表格!

答案 1 :(得分:0)

UPDATE `table_name` SET `category_id`='1' WHERE `category_name`="Cat One";

带有UPDATE子句的基本WHERE


尝试使用子查询(它从未经过测试):

UPDATE `table_name` u SET 
      `category_id`= (SELECT `category_id` 
                      FROM `table_name` t 
                      WHERE u.category_name = t.category_name 
                      GROUP BY category_name);

答案 2 :(得分:0)

UPDATE table_name SET category_id=1
WHERE category_name="Cat One" AND category_id<>1;

如果category_name是决定因素

UPDATE table_name, category 
SET table_name.category_id=category.category_id
WHERE table_name.category_name=category.category_name
AND table_name.category_id<>category.category_id;

你的问题越来越模糊......

UPDATE table_name, 
(select min(category_id) as cid, category_name from category 
group by category_name) as alias_table 
SET table_name.category_id=cid
WHERE table_name.category_name=alias_table.category_name;

答案 3 :(得分:0)

我认为你需要使用一些PHP或其他脚本语言。尝试以下几点:

$result_set = query("
    SELECT category_id, categeory_name
    FROM table_name
    WHERE 1
    GROUP BY category_name
    ORDER BY category_id ASC
"); //should give you all unique category_names and the lowest category_id for that name

while($row = mysql_fetch_assoc($result_set)) {
    query("UPDATE table_name SET category_id = {$row['category_id']} WHERE category_name = '{$row['category_name']}'");
}

答案 4 :(得分:0)

你应该首先问自己,你的设计是否真的是你想要的。

具体来说,我说的是关系正常化。您的表格似乎不在second normal form中。您可能需要考虑使用类别表,然后使用从产品表到类别表的外键。

看起来像这样

product_id | category_id 
     1            1         
     2            1          
     3            1         
     4            2         
     5            2        

category_id | category_name
     1            cat one
     2            cat two

要获得第二范式,您需要迁移数据。

创建类别表

create table categories (category_id int(11), category_name varchar(100));

然后在表格中选择所有冗余数据。

insert into categories
select 
 category_id,
 category_name
from products

删除冗余数据

delete c2 from categories c1, categories c2
where c1.category_name = c2.category_name and c1.category_id < c2.category_id

现在将产品表指向标准化数据

update products, categories
set product.category_id = categories.category_id
where product.category_name = categories.category_name

然后从产品

中删除category_name列
alter tables products drop column category_name

最后从产品中添加foreign key constraint到类别。

最终结果是标准化架构删除了冗余数据的可能性

编辑:我的意思是第二范式,而不是第一种。

另一个编辑:删除冗余数据步骤最初是错误的,并且会删除所有类别=)