我想检查users
表中的用户名。
如果找到了,那么我想获得id
。
否则,我想将用户名作为新记录插入,然后获取id
。
这是我的代码:
<?PHP
$sql = "SELECT id FROM users where username = '$username'";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_num_rows($query);
if($result){
$row = mysql_fetch_array($query);
$userid = $row["id"];
}else{
$sql = "insert into users set username = '$username'";
$query = mysql_query($sql) or die(mysql_error());
$userid = mysql_insert_id();
}
?>
如何优化或组合这些MySQL查询?
我可以在同一个查询中选择并插入吗?
会更好更快吗?
答案 0 :(得分:1)
如果您希望快速确定,请确保索引username
。
答案 1 :(得分:0)
最好先INSERT
,假设用户名不存在。如果任何错误是由重复冲突引起的,SELECT
现有行。
<?php
$sql = "INSERT INTO users SET username = '"
. mysql_real_escape_string($username) . "'";
$query = mysql_query($sql);
if ($query === true) {
$userid = mysql_insert_id();
} else {
if (mysql_errno() != 1022) { // this is the duplicate key error code
die(mysql_error());
}
$sql = "SELECT id FROM users where username = '"
. mysql_real_escape_string($username) . "'";
$query = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($query);
if ($row !== false) {
$userid = $row["id"];
}
}
?>
更好的原因是如果你选择插入,其他人可能会在你的两个SQL语句之间插入用户名。
当然,UNIQUE
上应该有users.username
约束。
重新评论:是的,你的脚本应该更快。如果没有重复的用户名(可能更常见),则不必运行SELECT
。
优化SQL查询的最佳方法是不运行它。