假设数据库中有大约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;
}
答案 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