Kleindberg
@Kleindberg
Full stack

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

У меня есть одна таблица со списком всех заказов. Она содержит такие поля:
id, номер заказа, имя, фамилия, телефон.

Я хочу разбить эту таблицу на две таблицы: заказы и клиенты.

В таблице заказы я хочу оставить id, номер заказа, а имя, фамилия, телефон заменить на id клиента из таблицы клиенты. Соответственно в таблице клиенты остаются поля id, имя, фамилия, телефон.

Я всё это сделал и связал таблицы внешним ключем id клиента в заказы = id в клиенты.

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

Есть ли такая возможность или я просто должен загрузить все данные, а потом вручную сопоставить их (например оставить в обеих таблицах номер телефона, сделать его уникальным и связать таблицы по телефону)?

Надеюсь смог объяснить суть.
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
CREATE TABLE client ( clientid INT AUTO_INCREMENT PRIMARY KEY,
                      firstname VARCHAR(255),
                      lastname VARCHAR(255),
                      phone BIGINT,                           -- если исходный VARCHAR - поменять, 
                                                              -- либо соотв. преобразование в INSERT
                      UNIQUE (firstname, lastname, phone) );  -- можно потом удалить

INSERT INTO client (firstname, lastname, phone)
    SELECT DISTINCT firstname, lastname, phone
    FROM orders_old;

CREATE TABLE order ( orderid INT AUTO_INCREMENT PRIMARY KEY,
                     ordernumber INT,
                     clientid INT,
                     FOREIGN KEY (clientid) REFERENCES client (clientid) );

INSERT INTO order (ordernumber, clientid)
    SELECT orders_old.ordernumber, client.clientid
    FROM orders_old
    JOIN client USING (firstname, lastname, phone);

NOT NULL - по вкусу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы