Дубликаты базы данных MySQL - PullRequest
       11

Дубликаты базы данных MySQL

0 голосов
/ 31 августа 2011

Вместо того, чтобы объяснить всю ситуацию, которая только добавила бы путаницу в вопрос, я просто решил пойти с очень легким примером таблицы и задать свой вопрос под ним

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

    product_id | category_id | category_name
         1            1           Cat One
         2            2           Cat One
         3            3           Cat One
         4            4           Cat Two
         4            5           Cat Two

Как я могу установить для второго и третьего ряда одинаковый category_id с первым?Так это выглядит так:

    product_id | category_id | category_name
        1             1            Cat One
        2             1            Cat One
        3             1            Cat One
        4             4            Cat Two
        5             4            Cat Two

Помня, мне нужно сделать это для 12 474 строк!: (

Я уже несколько часов бьюсь головой об стол. Любые идеи будут высоко оценены

Спасибо, Энди

PS: я забыл добавитьчто идентификаторы category_id должны быть одинаковыми, потому что имя_категории - Cat One для всех них

Редактировать 2: немного отредактировал образец таблицы, чтобы избежать путаницы

Ответы [ 5 ]

1 голос
/ 31 августа 2011

Создайте таблицу, которая сопоставляет каждое имя категории с идентификатором

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) SELECT NULL as id, `category_name` as name FROM `tableName` GROUP BY `category_name`

Затем UPDATE все

UPDATE `tableName`, `categories` 
  SET `tableName`.`category_id` = `categories`.`id` 
  WHERE `tableName`.`category_name` = `categories`.`name`

И затем отбросьте таблицу categories!

0 голосов
/ 31 августа 2011

Сначала вы должны спросить себя, действительно ли ваш дизайн действительно тот, который вам нужен.

В частности, я говорю о нормализации ваших отношений.Ваши таблицы не отображаются в второй нормальной форме .Возможно, вы захотите иметь таблицу категорий, а затем иметь внешний ключ из таблицы продуктов в таблицу категорий.

Похоже на это

product_id | category_id 
     1            1         
     2            1          
     3            1         
     4            2         
     5            2        

category_id | category_name
     1            cat one
     2            cat two

Чтобы перейти ко второй нормальной форме, вы бынеобходимо перенести данные.

Создать таблицу категорий

create table categories (category_id int(11), category_name varchar(100));

Затем выбрать все избыточные данные в таблицу.

insert into categories
select 
 category_id,
 category_name
from products

Удалить избыточные данные

delete c2 from categories c1, categories c2
where c1.category_name = c2.category_name and c1.category_id < c2.category_id

Теперь наведите таблицу продуктов на нормализованные данные

update products, categories
set product.category_id = categories.category_id
where product.category_name = categories.category_name

Затем удалите столбец category_name из продуктов

alter tables products drop column category_name

Наконец добавьте ограничение внешнего ключа из продуктов в категории.

Конечным результатом является нормализованная схема, исключающая возможность избыточных данных.

Редактировать: я действительно имею в виду вторую нормальную форму, а неfirst.

Другое редактирование: шаг «Удалить избыточные данные» изначально был неверным и удалил бы все категории =)

0 голосов
/ 31 августа 2011
UPDATE table_name SET category_id=1
WHERE category_name="Cat One" AND category_id<>1;

, если category_name является решающим фактором

UPDATE table_name, category 
SET table_name.category_id=category.category_id
WHERE table_name.category_name=category.category_name
AND table_name.category_id<>category.category_id;

и ваш вопрос становится более размытым ...

UPDATE table_name, 
(select min(category_id) as cid, category_name from category 
group by category_name) as alias_table 
SET table_name.category_id=cid
WHERE table_name.category_name=alias_table.category_name;
0 голосов
/ 31 августа 2011

Я думаю, вам понадобится немного PHP или другой язык сценариев.

Попробуйте что-нибудь вроде этого:

$result_set = query("
    SELECT category_id, categeory_name
    FROM table_name
    WHERE 1
    GROUP BY category_name
    ORDER BY category_id ASC
"); //should give you all unique category_names and the lowest category_id for that name

while($row = mysql_fetch_assoc($result_set)) {
    query("UPDATE table_name SET category_id = {$row['category_id']} WHERE category_name = '{$row['category_name']}'");
}
0 голосов
/ 31 августа 2011
UPDATE `table_name` SET `category_id`='1' WHERE `category_name`="Cat One";

Basic UPDATE с предложением WHERE.


Попробуйте это с подзапросами (никогда не проверялось):

UPDATE `table_name` u SET 
      `category_id`= (SELECT `category_id` 
                      FROM `table_name` t 
                      WHERE u.category_name = t.category_name 
                      GROUP BY category_name);
...