Подтвердить что ты не робот

Разделительные таблицы mysql

Я сделал ошибку, и мне нужно разбить 1 таблицу на 2. У меня есть таблица продуктов, и мне нужна таблица категорий. когда я начал, у меня было только 1 категория на продукт, но нет (с новым бизнес-требованием). Мне нужна возможность поместить продукт в несколько категорий.

У меня есть таблицы продуктов, в которых есть категория.

здесь таблица:

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

теперь, как я могу эффективно перенести это без моего сайта в автономном режиме?

У меня лампа на centos

4b9b3361

Ответ 1

Сначала убедитесь, что ваши категории уникальны. Убедитесь, что у вас нет чего-то типа:

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;

Это приведет к введению не дублированных категорий в таблицу категорий с уникальным идентификатором.

Теперь вы должны вставить эти записи в

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;

Ответ 2

Создать категорию таблицы:

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;

Надеюсь, что это поможет.

Ответ 3

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

Затем добавьте ограничение ключа foriegn на id в new_table_name, которое ссылается на исходную таблицу продуктов. После этого вы можете alter table product drop column column_name.

Ответ 4

Вы начнете с нормализации таблицы продуктов - создания 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.

Затем вам нужно будет создать соединения для получения продуктов по категориям.