在循环中编写sql查询是否正确

时间:2018-04-17 06:16:14

标签: php sql

假设数据库中有大约200,000条记录。 这里可以执行多达200,000次。这意味着它会将DB调用200,000次。

我的问题:这是正确的方法吗?还有更好的方法吗?

function get_new_key() {
    do {
        $new_key = 'some_xyz';
    } while ( function_call_to_check_newKey_exists_in_db );

    return $new_key;
}

2 个答案:

答案 0 :(得分:0)

选项1)使用代理键。自然键有其用途,但代理键有许多好处,灵活适用于一个。 Som sql-servers可能会生成非顺序自动生成的代理键。

选项2)使用http://php.net/manual/en/function.uniqid.php并信任try-and catch场景。

总的来说,既然您要抽200.000条记录(?),那么将它们放在文本文件中并在数据库中使用导入功能可能会更好。

答案 1 :(得分:0)

您最好确定如何生成new_key 。如果没有这些信息,那么对你没什么帮助。

如果是增量数,那么最好选择MAX(columnkey)+1(锁定表以防止冲突),或者更好的是,将其声明为PRIMARY KEY AUTO_INCREMENT并插入NULL值为了钥匙。这将自动设置密钥。使用LAST_INSERT_ID()恢复其价值:

INSERT INTO ... (all columns except key) VALUES (all values)
SELECT LAST_INSERT_ID() AS newkey;

或者您可以使用足够粒度的时间戳。

如果你想避免"漏洞"在编号中(不一定是一个不好的做法,但请有更好的理由这样做而不是" 它看起来更好"!),你可以LEFT JOIN表在右手表ID比左手侧大1的条件下自己。右侧为NULL的那些行表示它们的对应ID可用(再次,锁定表 - 在本例中,使用MySQL,两次):

-- You need an index on mykey
SELECT a.mykey+1 AS available 
    FROM mytable AS a 
    LEFT JOIN mytable AS b ON (a.mykey+1 = b.mykey)
    WHERE b.mykey IS NULL
    ORDER BY a.mykey LIMIT 20