MySQL过程仅在不存在时插入

时间:2015-11-19 13:05:31

标签: mysql stored-procedures

我正在使用MySQL存储过程,我想通过存储过程将表的数据库中的一些行插入到另一个表的数据库中。更具体地说,从数据库“new_schema”,表“Routers”和字段“mac_address”到数据库“data_warehouse2”,表“dim_cpe”和字段“mac_address”。

这是我在第一次插入时使用的代码,它完美无缺。

insert into data_warehouse2.dim_cpe (data_warehouse2.dim_cpe.mac_address, data_warehouse2.dim_cpe.ssid)
(select new_schema.Routers.mac_address, new_schema.Routers.ssid from new_schema.Routers, data_warehouse2.dim_cpe);

现在我在“路由器”表中有更多行要插入“dim_cpe”但是,因为已经存在行,所以我只想插入新的行。

正如其他帖子所见,我尝试了where子句:

where new_schema.device_info.mac_address != data_warehouse2.dim_cpe.mac_address

和a:

on duplicate key update new_schema.Routers.mac_address = data_warehouse2.dim_cpe.mac_address"

两者都不起作用。最好的方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以将源表保留在from子句之外,而是使用not exists子句:

where not exists
(select mac_address from dim_cpe mac_address = new_schema.Routers.mac_address
and ssid = new_schema.Routers.ssid)

或者您可以离开联接并检查dim_cpe中的字段是否为空:

insert into data_warehouse2.dim_cpe
(data_warehouse2.dim_cpe.mac_address, data_warehouse2.dim_cpe.ssid)
(select new_schema.Routers.mac_address, new_schema.Routers.ssid
from new_schema.Routers
  left join data_warehouse2.dim_cpe on
    new_schema.Routers.mac_address = data_warehouse2.dim_cpe.mac_address
    and new_schema.Routers.ssid = data_warehouse2.dim_cpe.ssid
where dim_cpe.mac_address is null and dim_cpe.ssid is null);

编辑说这是一个通用的SQL解决方案。我不确定是否有更好的MySql特定方法。

修改以显示您的查询:

insert into data_warehouse2.dim_cpe (mac_address, ssid)
select new_schema.Routers.mac_address, new_schema.Routers.ssid
from new_schema.Routers where not exists
    (select data_warehouse2.dim_cpe.mac_address from data_warehouse2.dim_cpe
    where data_warehouse2.dim_cpe.mac_address = new_schema.Routers.mac_address
       and data_warehouse2.dim_cpe.ssid = new_schema.Routers.ssid);