mysql分隔表

时间:2011-11-30 02:33:51

标签: php mysql migration

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

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

这里有桌子:

product (id, name, category, price etc...)

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

我在灯上点灯

4 个答案:

答案 0 :(得分:24)

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

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;

答案 1 :(得分:3)

创建表类别:

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;

希望这有帮助。

答案 2 :(得分:0)

INSERT INTO new_table_name ("product", "category")
SELECT id, category
FROM product;

然后在引用原始产品表的新表名中的id上添加外键约束。在此之后,您可以alter table product drop column column_name

答案 3 :(得分:0)

您首先要规范产品表 - 创建2个新表:

CREATE TABLE categories
(
  cat_id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
  cat_label varchar(40)
);

CREATE TABLE product_by_category
(
  pbc_prod_id int REFERENCES products(id),
  pbc_cat_id int REFERENCES categories(cat_id),
  #indexes for quicker lookup...
  INDEX pbc(pbc_prod_id,pbc_cat_id),
  INDEX cbp(pbc_cat_id, pbc_prod_id)
);



  INSERT INTO categories(cat_label) SELECT DISTINCT category FROM product;
   INSERT INTO product_by_category(pbc_prod_id, pbc_cat_id)
      SELECT id, (SELECT cat_id FROM categories WHERE categories.cat_label = product.category)
      FROM products;

    ALTER TABLE products DROP COLUMNN category;  #do this after you are satisfied with contents of new tables.

然后,您必须创建连接以按类别获取产品。