i made a mistake and i have to split 1 table into 2. i have a product table and i need category table. when i started i only had 1 category per product but not (with new business requirement) i need the ability to put a product in multiple category.
i have a product tables that has a category in it.
here's the table:
product (id, name, category, price etc...)
now, how can i efficiently migrate this without make my site offline?
i have lamp on centos
Source: Tips4all, CCNA FINAL EXAM
Create a table category:
ReplyDeleteCREATE TABLE category(id int primary key not null auto_increment, category varchar(40))
Then select unique categories from product table:
INSERT INTO category (category) SELECT DISTINCT category FROM product;
Then create a table for relations:
CREATE TABLE product_to_category (product_id int, category_id int);
If you want, you can use foreign keys and constraints.
Then you can migrate your existing relations:
INSERT INTO product_to_category SELECT product.id, category.id FROM product JOIN category on category.category=product.category;
After that, adjust your code to use the new structure and drop the category column from product table:
ALTER TABLE product DROP COLUMN category;
Hope this helps.
INSERT INTO new_table_name ("product", "category")
ReplyDeleteSELECT id, category
FROM product;
Then add a foriegn key constraint on id in new_table_name which references the original product table. After this you can alter table product drop column column_name.
You would start by normalizing your product table - creating 2 new tables:
ReplyDeleteCREATE 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.
Then you would have to create joins for getting products by category.