比较两个不同的MySQL表中的数据,插入新数据并更新不匹配的数据。

4
我正在尝试比较不同表格中的数据,插入新数据,并更新不匹配的数据。

例如:

我有table1
------------------------------------
| ITEMNO | DESCRIPTION  |  FORSALE |
------------------------------------
| 123456 | Description1 |   YES    |
------------------------------------
| 234567 | Description2 |   YES    |
------------------------------------
| 345678 | Description3 |   YES    |
------------------------------------

我还有一个只是临时表格的table2

----------
| ITEMNO |
----------
| 123456 |
----------
| 234567 |
----------

ITEMNO是table1的主键,也是table2的外键

因此,当程序的一个模块发送数据时,它首先会检查table2,然后将数据与table1进行比较

如果发送的数据如下:

  table2        table1
----------    ----------
| ITEMNO |    | ITEMNO |
----------    ----------
| 123456 |  = | 123456 | (与table1和table2匹配,然后更新)  
----------    ----------
| 234567 |  = | 234567 | (与table1和table2匹配,然后更新)
----------    ----------
| 567890 |  = | 567890 | (新数据,然后插入到table1中)
----------    ----------
              | 345678 | (在table2中不存在但在table1中存在,因此将FORSALE字段更新为“NO”)
              ----------

任何帮助将不胜感激,提前感谢。


我认为,这不能通过纯SQL完成,因为MySQL不支持像Oracle那样的MERGE语句。你需要在PHP中使用分支来解决这个问题。 - Hotdin Gurning
@RubahMalam 哦天啊,对不起。我忘记说我也使用 PHP 作为编程语言了。 - mabbs
有插入表单吗? - Abdulla Nilam
@Abdulla 这是一个网络服务,所以不行。抱歉。 - mabbs
那么,如何向临时表添加数据?是否有任何与之关联的变量? - Abdulla Nilam
@Abdulla 它位于不同的模块中,基本上只是表1的备份。 - mabbs
2个回答

0

您可以通过以下2个SQL语句来实现:

UPDATE table1 AS t1 
LEFT JOIN table2 AS t2 ON t1.itemno=t2.itemno 
SET t1.FORSALE='No' 
WHERE t2.itemno IS NULL;

INSERT IGNORE INTO table2 (itemno) SELECT t1.itemno 
FROM table1 AS t1 
LEFT JOIN table2 AS t2 ON t1.itemno=t2.itemno 
WHERE t2.itemno IS NULL;

但更好的选择是使用存储过程,它将首先从下面的查询中获取不匹配的itemno并将其保存在游标中,然后根据主键进行更新和插入,这样可以避免锁定。

SELECT t1.itemno 
FROM table1 AS t1 
LEFT JOIN table2 AS t2 ON t1.itemno=t2.itemno 
WHERE t2.itemno IS NULL;

感谢您提供的解决方案,我会尝试并随时更新。 - mabbs

0
你需要2个查询。你可以尝试这个:
//NEW DATA THEN INSERT INTO TABLE 1
insert into table1(item_no,description)
select item_no,description
from table2
where item_no not in(
    select item_no from table1
);

并且

//DOESN'T EXIST IN TABLE2 BUT EXISTS IN TABLE 1 SO UPDATE FORSALE FIELD TO "NO"
update table1
set forsale = 'NO'
where item_no not in(
    select item_no from table2
)

如果TABLE1 AND TABLE2匹配,则不执行任何操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接