我犯了一个错误,我必须将1个表拆分为2个。我有一个产品表,我需要类别表。当我开始的时候,每个产品只有一个类别,但没有(具有新的业务要求),我需要能够将一个产品归为多个类别。

我有一个产品表,其中有一个类别。

这是桌子:

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;

关于php - MySQL的分离表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8320455/

10-09 22:05