php - mysql 分隔表

标签 php mysql migration

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

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

这是 table :

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/

相关文章:

php - json_encode 返回 200 且未定义

php - 如何从 SQL View 中进行 SELECT? (一般错误: 1615 Prepared statement needs to be re-prepared)

mysql - Express - Sequelize - 在查询中添加外表字段

ruby - Rake 迁移错误 - 事件记录中的 "undefined method" "migrate"

core-data - -[NSCFDictionary initWithObjects :forKeys:count:]: attempt to insert nil value at objects[0] (key: sourceRelationship)

php - fatal error : Class 'ZipArchive' not found while only download as zip from online

php - 在 Smarty 模板中运行 MySQL 查询

php - 当输入字段的数量和名称发生变化时,如何确保 MySQL 插入的列匹配?

mysql - 在 INSERT 语句中使用 SQL 子查询

mysql - 无法抓取 db :migrate because of mysql missing . frm 文件