software phinx migrations lab php mysql migration

php - phinx - mysql separando tablas



php artisan migrate (4)

Comenzaría por normalizar la tabla de productos, creando 2 tablas nuevas:

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.

Entonces tendrías que crear uniones para obtener productos por categoría.

Cometí un error y tengo que dividir 1 tabla en 2. Tengo una tabla de productos y necesito una tabla de categorías. cuando comencé solo tenía 1 categoría por producto pero no (con un nuevo requisito comercial) necesito la capacidad de colocar un producto en categoría múltiple.

Tengo una tabla de productos que tiene una categoría en ella.

Aquí está la mesa:

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

ahora, ¿cómo puedo migrar esto de manera eficiente sin tener que desconectar mi sitio?

tengo lampara en centos


Crear una categoría de tabla:

CREATE TABLE category(id int primary key not null auto_increment, category varchar(40))

Luego seleccione categorías únicas de la tabla de productos:

INSERT INTO category (category) SELECT DISTINCT category FROM product;

Luego crea una tabla para las relaciones:

CREATE TABLE product_to_category (product_id int, category_id int);

Si lo desea, puede utilizar claves externas y restricciones.

Entonces puedes migrar tus relaciones existentes:

INSERT INTO product_to_category SELECT product.id, category.id FROM product JOIN category on category.category=product.category;

Después de eso, ajuste su código para usar la nueva estructura y elimine la columna de categoría de la tabla de productos:

ALTER TABLE product DROP COLUMN category;

Espero que esto ayude.


Primero asegúrese de que sus categorías son únicas. Asegúrate de no tener algo como:

productx and produtx

De lo contrario, cuando inserte categorías malas.

Tendrás que hacerlo en el paso:

1) Creando la categoría de tabla

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;

Cree la tabla de intersección ya que un producto puede estar en múltiples categorías y una categoría puede tener múltiples productos.

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) inserta las categorías en la tabla.

INSERT IGNORE INTO category SELECT DISTINCT category from product;

Esto insertará categorías no duplicadas en la tabla de categorías con una identificación única.

Ahora, tienes que insertar estos registros en el

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) Ahora tiene que modificar su código para usar la consulta correcta: Ejemplo:

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) Ahora, cuando se sienta cómodo con los cambios en su código, puede eliminar la columna no utilizada:

ALTER TABLE product DROP COLUMN category;


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

Luego, agregue una restricción clave clave en id en new_table_name que haga referencia a la tabla del producto original. Después de esto, puede alter table product drop column column_name .