MySQL 替换为 null

问题描述 投票:0回答:2

我正在使用替换来用另一个表中的信息更新一个表。 第一个表称为 srv_update,它包括:

srv_id,    , srv_list_price,   srv_list_price
'120', 'Third Feline PCR', '20.25'
'121', 'Flu Rhino Vacc', '26.00'
'122', 'Scaly Mite', '35.00'
'123', 'Intestinal Parasite Screen', '26.00'
'124', 'Tick Removal', '15.00'
'125', 'Behaviour Modification', '75.00'
'126', 'Vitamin E- Concentrated', '30.00'
'127', 'Sedative-Feline', '25.00'
'128', 'Flea Treatment- Small Animal', '35.00'
'129', 'Flea Treatment- Large Animal', '50.00'

第二个表是 srv_update_changes_2,它包括:

item_id,   item_desc,      item_list_price
'134', 'Vitamin E series', '55.00'
'135', 'Feline PCR Series', '75.00'
'114', 'H1N1 vaccine', '75.00'
'115', 'H1N2 vaccine', '75.00'
'127', 'Sedative- small mammal', '75.00'
'111', 'Rabies_V-Rodent', '25.00'
'129', NULL, '25.00'

我只想替换现有 ID,而不插入任何新 ID。另外,如果desc字段为空(针对第二个表的id 129),则替换空字段时应保留原表的值(第一个表中的描述)

129 是唯一应该受到影响的行。我将其添加到表中试图弄清楚这一点,但我似乎无法理解其中的逻辑。我尝试过 ifnull 并尝试过合并,但我似乎无法获得正确的输出。它要么在更新的表中保持为空,要么插入错误的描述。

我还尝试合并第二个字段是一个子查询,检查第一个字段是否为空,以将其替换为第一个表中的服务描述,其中该行项目 id 与第二个表中的 srv id 匹配,其中其 desc 行为空

replace into upd_services
select item_id,
coalesce(item_desc,(
    select srv_desc 
from upd_services 
where srv_id in(
    select item_id
    from upd_services_changes_2
    where item_desc is null))) srv_desc,
item_list_price
from upd_services_changes_2 
where item_id in (
select srv_id
from upd_services)

感谢您的帮助

mysql null
2个回答
0
投票

我会将

update
join
一起使用:

update upd_services us join
       upd_services_changes_2 usc
       on us.srv_id = usc.item_id
    set us.srv_desc = coalesce(usc.item_desc, us.srv_desc),
        us.srv_list_price = usc.item_list_price;

0
投票

我发现

REPLACE INTO
根据查询中的键确定是插入还是更新。

原始海报有这些键:

item_id
item_desc
item_list_price

使

item_id
列成为唯一键,您可以将 NULL 插入到
item_desc
中,而无需创建重复的行。

REPLACE INTO `items` (item_id, item_desc, item_list_price) VALUES (129, NULL, 25.00);

需要记住的一件事是,如果您创建的行中唯一键列具有 NULL 值,则 REPLACE INTO 将插入一条新记录。它不会将 NULL 视为要更新的现有值。

© www.soinside.com 2019 - 2024. All rights reserved.