mysql 分离表
我犯了一个错误,我不得不把1张桌子分成2张。我有一个产品表,我需要类别表。当我开始时,每个产品只有1个类别,但不是(有新的业务需求),我需要能够将产品放在多个类别中。
我有一个产品表,里面有一个类别。
这是表格:
product (id, name, category, price etc...)
现在,如何在不使我的网站脱机的情况下有效地迁移它?
我有灯在 centos 上
我犯了一个错误,我不得不把1张桌子分成2张。我有一个产品表,我需要类别表。当我开始时,每个产品只有1个类别,但不是(有新的业务需求),我需要能够将产品放在多个类别中。
我有一个产品表,里面有一个类别。
这是表格:
product (id, name, category, price etc...)
现在,如何在不使我的网站脱机的情况下有效地迁移它?
我有灯在 centos 上
首先,请确保您的类别是唯一的。确保您没有类似的东西:
productx and produtx
否则,当您插入错误的类别时。
您必须按以下步骤操作:
1) 创建表类别
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(40) NOT NULL DEFAULT 'General',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
创建交集表,因为一个产品可以位于多个类别中,一个类别可以有多个产品。
CREATE TABLE `product_category` (
`product_id` int(10) unsigned NOT NULL,
`category_id` int(10) unsigned NOT NULL,
PRIMARY KEY product_category (`product_id`,`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
2) 将类别插入到表中。
INSERT IGNORE INTO category SELECT DISTINCT category from product;
这会将非重复类别插入到具有唯一 ID 的类别表中。
现在,您必须将这些记录插入到
INSERT IGNORE INTO `product_category` SELECT `product`.`id` AS `product_id`, `category`.`id` AS `category_id` FROM `category` LEFT JOIN `product` ON (`category`.`name` = `product`.`category`);
3)现在你必须修改你的代码才能使用正确的查询:示例:
SELECT
/* your fields */
FROM
product
INNER JOIN product_category ON (product.id = product_category.product_id)
INNER JOIN category ON (category.id = product_category.category_id)
WHERE ...
4)现在,当您对代码更改感到满意时,可以删除未使用的列:
ALTER TABLE product DROP COLUMN category;
创建表类别:
CREATE TABLE category(id int primary key not null auto_increment, category varchar(40))
然后从产品表中选择唯一类别:
INSERT INTO category (category) SELECT DISTINCT category FROM product;
然后为关系创建一个表:
CREATE TABLE product_to_category (product_id int, category_id int);
如果需要,可以使用外键和约束。
然后,您可以迁移现有关系:
INSERT INTO product_to_category SELECT product.id, category.id FROM product JOIN category on category.category=product.category;
之后,调整代码以使用新结构,并从产品表中删除类别列:
ALTER TABLE product DROP COLUMN category;
希望这有帮助。