mysql分隔表

rcs*_*s20 18 php mysql migration

我犯了一个错误,我必须将1个表分成2个.我有一个产品表,我需要类别表.当我开始时我每个产品只有1个类别但没有(有新的业务要求)我需要能够将产品放在多个类别中.

我有一个产品表,其中包含一个类别.

这是表:

product (id, name, category, price etc...)
Run Code Online (Sandbox Code Playgroud)

现在,如何在不使我的网站脱机的情况下有效地迁移它?

我有点数的灯

Boo*_*eus 24

首先确保您的类别是唯一的.确保你没有类似的东西:

productx and produtx
Run Code Online (Sandbox Code Playgroud)

否则,您将插入错误的类别.

您必须在步骤中执行此操作:

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;
Run Code Online (Sandbox Code Playgroud)

创建交集表,因为产品可以是多个类别,而类别可以有多个产品.

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;
Run Code Online (Sandbox Code Playgroud)

2)将类别插入表中.

INSERT IGNORE INTO category SELECT DISTINCT category from product;
Run Code Online (Sandbox Code Playgroud)

这会将非重复类别插入到具有唯一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`);
Run Code Online (Sandbox Code Playgroud)

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 ...
Run Code Online (Sandbox Code Playgroud)

4)现在,当您对代码更改感到满意时,可以删除未使用的列:

ALTER TABLE product DROP COLUMN category;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢我有3个类似名称的类别,并将所有查询放在一起,你的帮助表示赞赏 (4认同)