[英]Insert rows only when id from another table exists
我的程序获取一个ID列表,其中一些在我们的系统中,而有些则不在。 目的是为我们系统中存在的ID进入表中,但忽略不存在的ID。
例:
Incomming My System Inserted
555 583 583
583
599
我最初的想法是使用INSERT IGNORE
但是要检查的ID列表位于users表中,并且将行插入到事件表中。 我还尝试了外键约束,但是INSERT IGNORE
不会因FK默默地失败-它会产生一个错误,该错误会杀死随后的所有插入。
我当前的攻击角度是从用户表中读取所有ID到PHP,并在尝试插入之前检查PHP中的ID,但这似乎不是最佳选择。 有MySQL的方法吗?
INSERT INTO your_id_table (ID)
SELECT ID FROM my_system_table WHERE ID IN (list_of_ids)
我希望它很清楚,您根本不需要执行任何检查,您只需运行查询并完成查询即可。
您可以使用if exist()语句在插入之前检查用户表中是否存在该值。
if exists (select * from user where id = @id)
begin
/*insert*/
end
else
begin
/*return a status message or insert in error table to track failed records*/
end
这是一个很丑陋的方法,但是它起作用:
$ids = array( /* ids */ );
$ids = implode(',', $ids);
$sql = 'SELECT `id` FROM `table` WHERE `id` IN ('.$ids.')';
$result = $db -> query($sql);
$exists = $result -> fetch_all();
$doesntExist = array_diff($ids, $exists);
您可以尝试:
INSERT INTO Inserted(id) VALUES SELECT id FROM Incoming WHERE id IN (SELECT id FROM My_System)
这将选择也在My_System中接收的ID中的ID,并将其插入Inserted中。
您可以进行如下操作:
INSERT INTO events (iduser)
SELECT iduser
FROM users WHERE iduser IN (1,2,3,4,5)
该查询将仅返回表上存在的用户ID,因此可以解决问题。
如果您要插入更多列,它将如下所示:
$idsToInsert = "1,2,3,4,5,6";
$query = "INSERT INTO events (iduser, title)
SELECT iduser, ".$title."
FROM users WHERE iduser IN (".$idsToInsert.")";
并且不要忘了使用mysql_real_escape清理输入内容,也可以使用参数化查询来完成此操作。
查询的最后一部分必须动态地通过PHP生成,但这不是问题
插入到表中进行选择的Mysql参考在这里: http : //dev.mysql.com/doc/refman/5.0/en/insert-select.html
您可以在PHP代码上执行此操作
$result = mysql_query("SELECT id FROM another_table WHERE id = '100'");
$number_of_rows = mysql_num_rows($result);
if ($number_of_rows > 0) {
// ID exist in other table
}
FK产生错误,该错误会杀死随后的所有插入
为什么这会杀死后面的插入? 逐一插入, try
- catch
mysql错误。
这是我能想到的最优雅的解决方案:
INSERT INTO events (id)
SELECT id FROM my_system ms
LEFT JOIN incoming i
ON i.id = ms.id
WHERE i.id IS NOT NULL
这里的想法是您排除传入表中那些在my_system表中没有匹配记录的记录,因为传入ID的结果集将为null。
看起来其他人已经想出了类似的解决方案! 希望这对您有所帮助。
内部联接是最干净的方法
INSERT INTO events (id)
SELECT incoming.id
FROM my_system ms
INNER JOIN incoming i
USING (id);
只需将传入ID加载到传入表中即可。 另外,请记住将id作为两个表的PRIMARY KEY。
做就是了:
insert into events (id, value1, value2, ...)
select id, @value1, @value2, ...
from users
where id = @id
这样,仅当您的users
表中已经存在该ID时,它才会插入。 这是假设的id
值是在各行的users
表,但如果它不只是增加distinct
后选择,以确保只有一个行插入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.