问题描述
我正在实施这样一种情况:INSERT ...ON DUPLICATE KEY UPDATE 需要仅在满足 IF 条件后执行。 我对如何包含条件语句有疑问。 _没有这个 IF 条件,mysql 查询工作正常。我试过 WHERE 语句,但插入...重复键更新不支持 WHERE 语句。
请指导我解决这个问题。
实现流程是这样的:
表1 PRIMARY KEY(SL_No,unique_address)
SL_No| Unique_Addres| hostname| Address|
1| 20211001|Peter Rick| Ohio|
2| 20211011| Rowan| London|
3| 20211019| Lily| Perth|
表2 主键(fk_id,unique_address) FOREIGN KEY (unique_address) REFERS table1(unique_address)
fk_id| Unique_Address| Check_in| Check_out|
20-10-01| 20211001| 15:00| 16:00|
20-12-12| 20211011| 09:39| NULL|
具有唯一地址的新唯一条目,例如(fk_id,'KEY') 应该在验证'KEY'已经在table1中注册之后插入到table2中。否则,拒绝该条目并且不要将其输入到表 2 中。 验证后,
insert values('fk_id','KEY','value',null)(如果表2中不存在该条目) 或
update(?,?,value)(如果表 2 中已经存在该条目)。
例如
INSERT INTO table2('21-02-12','202111012','15:13',DEFAULT)
ON DUPLICATE KEY UPDATE `Check_out` = '15:13';
--This query above should not execute
--because unique_address '202111012' is not in table1
#Pseudo query
SET @KEY = '20211011',@dat ='20-12-12',@tim = '18:10'
IF EXISTS(@KEY in (SELECT table1.unique_address FROM table1))
{
INSERT INTO table2 (fk_id,unique_address,col1,col2)
VALUES(@dat,@KEY,@tim,DEFAULT)
ON DUPLICATE KEY UPDATE col2 = @tim;
}
ELSE
{
RETURN;
--do nothing or skip to next iteration( if inside a loop)
}
上面的伪查询应该更新 table2 的第二行,它应该是这样的:
fk_id| Unique_Address| Check_in| Check_out|
20-10-01| 20211001| 15:00| 16:00|
20-12-12| 20211011| 09:39| 18:10|
如何进行以获得所需的结果?使用 WHERE 子句还是 IF EXISTS() 子句并不重要,只要我得到了想要的结果。
编辑:-
我想出了一个可能的解决方案。
INSERT IGNORE INTO `table2`(`fk_ID`,`Unique_Address`,`Check_in`,`Check_out`)
VALUES (
'20-12-25',(SELECT table1.Unique_Address from table1 WHERE table1.Unique_Address = '20211089'),'15:19',DEFAULT)
on duplicate key UPDATE `Check_out` = '15:19';
我通过上面的查询得到了想要的结果。但在未注册的 unique_address 的情况下,输入了一个带有空的 Unique_Address 单元格的新行。像这样:
fk_id| Unique_Address| Check_in| Check_out|
20-10-01| 20211001| 15:00| 16:00|
20-12-12| 20211011| 09:39| 18:10|
20-12-13| | 15:19| NULL|
有没有其他有效的方法来做到这一点,以便没有这样的空单元格(空的 Unique_Address 单元格)?
提前致谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)