Две таблицы, обновите определенные столбцы и / или вставьте новую запись, если не существует

У меня две таблицы: NewData и RecentData

      NewData

id | Order_Number | Company | SerialNumber | ShipDate
-----------------------------------------------------
 1 | 2323         | Apple   |  SN2324      | 2018-09-12 00:00:00
 2 | 53444        | Telsa   |  SN9098      | 2018-09-12 00:00:00
 3 | 42321        | Stack   |  SN9999      | 2018-09-12 00:00:00



      RecentData

id | Order_Number | Company | SerialNumber | ShipDate
-----------------------------------------
 1 | 2323         | Apple   |              | 2018-05-05 00:00:00
 2 | 53444        | Telsa   | oldserial    | 2018-07-20 00:00:00

Когда Дата отправки изменился в таблице NewData, мне нужно Обновить ТОЛЬКО для столбцов Дата отправки и Серийный номер в таблице RecentData. Также, если Order_Number существует в таблице NewData, но НЕ существует в таблице RecentData, добавьте всю строку в таблицу RecentData.

Я пробовал следующее:

UPDATE RecentData
LEFT JOIN NewData on NewData.Order_Number = RecentData.Order_Number
SET RecentData.Order_Number = NewData.Order_Number;

Но это удаляет порядковый номер в столбце Order_Number.

Пожалуйста помоги!

Здравствуйте, добро пожаловать, ваше требование может быть выполнено триггером для обновления таблицы «RecentData» при обновлении таблицы «NewData».

Sonam Tripathi 10.09.2018 07:34

Как? Пожалуйста, дополните?

ScannedFrom Toshiba 10.09.2018 07:45

Пожалуйста, возьмите ссылку на stackoverflow.com/questions/2678102/…

Sonam Tripathi 10.09.2018 07:56
0
3
53
1

Ответы 1

Есть несколько способов решения вашей задачи. Какой способ лучше, зависит от конкретного проекта.

Способ 1: Вы можете создать первичный ключ по столбцу Order_Number и использовать конструкцию ON DUPLICATE KEY, например:

INSERT INTO RecentData (Order_Number, Company, SerialNumber, ShipDate)
  (SELECT Order_Number,
          Company,
          SerialNumber,
          ShipDate
   FROM NewData) ON DUPLICATE KEY
UPDATE RecentData.SerialNumber = NewData.SerialNumber,
   RecentData.ShipDate = NewData.ShipDate;

Способ 2: Вы можете использовать два запроса: первый запрос для обновления существующих данных и второй запрос для вставки новых данных. Например, первый запрос:

UPDATE RecentData
RIGHT JOIN NewData ON NewData.Order_Number = RecentData.Order_Number
SET RecentData.SerialNumber = NewData.SerialNumber,
    RecentData.ShipDate = NewData.ShipDate
WHERE NewData.ShipDate > <last_updating_date>

Например, второй запрос:

INSERT INTO RecentData (Order_Number, Company, SerialNumber, ShipDate)
  (SELECT Order_Number,
          Company,
          SerialNumber,
          ShipDate
   FROM NewData
   WHERE ShipDate > <last_updating_date> AND order_number NOT IN
       (SELECT order_number
        FROM RecentData))

Способ 3: Вы можете создать триггер по событию UPDATE, например:

delimiter //
CREATE TRIGGER mytgigger BEFORE UPDATE ON NewData
FOR EACH ROW
BEGIN
    IF (old.ShipDate <> new.ShipDate) THEN
        SET cnt = (SELECT COUNT(*) FROM RecentData WHERE order_number = new.order_number);
        IF cnt > 0 THEN
            UPDATE RecentData
            SET RecentData.SerialNumber = NewData.SerialNumber,
                RecentData.ShipDate = NewData.ShipDate
            WHERE order_number = new.order_number;
        ELSE
            INSERT INTO RecentData (Order_Number, Company, SerialNumber, ShipDate)
            VALUES (new.Order_Number,
                new.Company,
                new.SerialNumber,
                new.ShipDate);
        END IF;
     END IF;
END;//
delimiter ;

Иногда есть несколько записей с одним и тем же номером order_number. Например, если компания приобрела несколько оборудования, в order_number будет запись для с тем же номером order_number для каждого серийного номера оборудования. Я думаю, что третий способ может быть лучшим способом ...

ScannedFrom Toshiba 10.09.2018 15:02

Другие вопросы по теме