【问题标题】:Two tables, update specific columns and/or insert new record if doesnt exist两个表,更新特定列和/或插入新记录(如果不存在)
【发布时间】:2019-02-14 12:29:34
【问题描述】:

我有两个表:NewDataRecentData

      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

ShipDateNewData 表上发生变化时,我只需要 更新 ShipDate 和 SerialNumber 列。此外,如果 NewData 表中确实存在 Order_Number,但 RecentData 表中不存在,则将整行添加到 RecentData 表中。

我尝试了以下方法:

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

但这会删除 Order_Number 列中的订单号。

请帮忙!

【问题讨论】:

  • 您好,欢迎您通过在更新“NewData”表时更新表“RecentData”表的触发器来实现您的要求。
  • 怎么样?请详细说明?

标签: php mysql


【解决方案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 相同的记录。我认为第三种方式可能是最好的方式......
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2022-06-10
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2010-12-29
相关资源
最近更新 更多