我的程序获取了一个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方法可以做到这一点?
答案 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
以确保只插入一行。