我正在使用替换来用另一个表中的信息更新一个表。 第一个表称为 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)
感谢您的帮助
我会将
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;
我发现
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 视为要更新的现有值。