繁体   English   中英

仅当存在另一个表的ID时才插入行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM