2016-10-20 5 views
1

У меня есть база данных в MySQL, и я хочу ее перенести, немного изменив структуру таблиц.Как получить идентификатор записи из другой таблицы?

Я новичок в MySQL, так что медведь со мной, пожалуйста.

У меня есть следующие таблицы:

Адреса

  • address_id
  • адрес (например: пятьдесят пятая улица)
  • zip_code
  • город
  • страна

CustomersOld

  • customer_id
  • имя
  • billing_address
  • billing_zip_code
  • billing_city
  • billing_country

Я хочу перенести данные клиентов в новую таблицу со следующей структурой

CustomersNew

  • customer_id
  • billing_address_id (внешний ключ для таблицы адресов)

Так , Я хочу взять 4 поля адреса фактуры из таблицы CustomersOld и сделать это:

  1. Проверьте, содержит ли таблица Addresses запись, соответствующую полям платежного адреса.

    1.1. Если да, то только возвращайте AddressID.

    1.2. Если нет, создайте эту запись и верните AddressID.

  2. Вставьте адресID в таблицу CustomersNew в поле address_id.

Обычно я использую этот простой скрипт для переноса таблицы:

INSERT INTO CustomersNew 
SELECT * FROM CustomersOld 

Я полагаю, я должен был бы выполнять некоторые вложенные ВЫБИРАЕТ и соединения:

INSERT INTO CustomersNew 
    (customer_id, billing_address_id) 
SELECT 
    customer_id, 
    -- SELECT/JOIN ... (something like that, in order to get the address_id) 
FROM CustomersOld 

Не могли бы вы мне помочь в получение соответствующего , для каждого клиента, пожалуйста?

Благодаря

ответ

1

Это должно быть сделано в два этапа. Сначала нужно создать все Addresses записи:

INSERT INTO Addresses (address, zip_code, city, country) 
SELECT DISTINCT billing_address, billing_zip_code, billing_city, billing_country 
FROM CustomersOld; 

Затем создать все CustomersNew записи, вступив в эту таблицу CustomersOld

INSERT INTO CustomersNew (customer_id, billing_address_id) 
SELECT c.customer_id, a.address_id 
FROM CustomersOld AS c 
JOIN Addresses AS a ON c.billing_address = a.address AND c.billing_zip_code = a.zip_code AND c.billing_city = a.city AND c.billing_country = a.country 
0

Я предлагаю вам этот путь

флиртует выравнивать adderesses к последнему CustomerOld адрес

insert into Addresses (address, zip_code, city, country) 
select billing_address, billing_zip_code, billing_city, billing_country 
from CustomerOld 
where (billing_address, billing_zip_code, billing_city, billing_country) not in 
      (select address, zip_code, city, country 
       from Addresses 
      ) 

затем создавать и заполнять КлиентыНовое с выбором создания

create table CustomersNew 
select a.customer_id, b.address_id 
from CustomersOld as a 
inner join Addresses as b on a.billing_address = b.address 
    and a.billing_zip_code = b.zip_code 
     and a.billing_city = b.city 
     and a. billing_country = b.country 
Смежные вопросы