仅当存在来自另一个表的id时才插入行

时间:2011-10-21 19:21:32

标签: php mysql

我的程序获取了一个ID列表,其中一些在我们的系统中,其中一些不在。目标是在表格中输入我们系统中存在的ID,但忽略那些不存在的ID。

示例:

Incomming    My System    Inserted
555          583          583
583
599

我最初的想法是使用INSERT IGNORE,但要检查的ID列表在users表中,并且行正在插入到events表中。我还尝试了一个外键约束,但INSERT IGNORE没有使用FK静默失败 - 它会产生一个错误,会导致任何后续插入。

我目前的攻击角度是读入users表中的所有ID到PHP,并在尝试插入之前检查PHP中的ID,但这似乎不是最佳的。是否有MySQL方法可以做到这一点?

10 个答案:

答案 0 :(得分:3)

INSERT INTO your_id_table (ID) 
SELECT ID FROM my_system_table WHERE ID IN (list_of_ids)

我希望它清楚,通过这个你根本不需要做任何检查,你只需运行查询并完成它。

答案 1 :(得分:1)

您可以使用if exists()语句在插入之前检查用户表中是否存在该值。

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

答案 2 :(得分:1)

这是一种非常丑陋的方式,但它确实有效:

$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);

答案 3 :(得分:1)

你可以尝试:

INSERT INTO Inserted(id) VALUES SELECT id FROM Incoming WHERE id IN (SELECT id FROM My_System)

这将选择Incomming中同样位于My_System中的id并将其插入到Inserted中。

答案 4 :(得分:1)

你可以做这样的事情:

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

答案 5 :(得分:0)

您可以在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
}

答案 6 :(得分:0)

  

FK产生错误,导致任何后续插入

为什么杀掉插入后?逐个插入,try - catch mysql错误。

答案 7 :(得分:0)

这是我能想到的最优雅的解决方案:

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

这里的想法是在Incoming表中排除那些在my_system表中没有匹配记录的记录,因为对于Incoming ID,结果集将为null。

看起来其他人已经提出了类似的解决方案!无论如何,希望这会有所帮助。

答案 8 :(得分:0)

内连接是最简单的连接方式

INSERT INTO events (id) 
SELECT incoming.id
FROM my_system ms 
INNER JOIN incoming i  
USING (id);

只需将传入的ID加载到传入的表中即可。另外,请记住将id作为两个表的PRIMARY KEY。

答案 9 :(得分:0)

只是做:

insert into events (id, value1, value2, ...)
select id, @value1, @value2, ...
from users
where id = @id

这样,只有在users表中已经存在id时才会插入。这假设id表中的每一行的users值都是唯一的,但如果不是在select之后添加distinct以确保只插入一行。