而不是解释整个情况,这只会增加问题的混乱,我刚刚决定采用一个非常简单的表格示例并在下面问我的问题
我有一个数据库表,看起来像这样:
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:编辑表格样本以避免混淆
答案 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到类别。
最终结果是标准化架构删除了冗余数据的可能性。
编辑:我的意思是第二范式,而不是第一种。
另一个编辑:删除冗余数据步骤最初是错误的,并且会删除所有类别=)