以下是我在mysql中的数据库:
Id Username Password
1 admin admin
2 jay jay1
3 suman xyza
4 chintan abcde
这是我在php中的代码:
$fetchid = mysql_query(" SELECT MAX(Id) As max From user;");
$row = mysql_fetch_array($fetchid);
$largest = $row['max'];
$largest++;
$user= $_POST['username'];
$pass= $_POST['password'];
$result = mysql_query(" INSERT INTO `proshell`.`user` (
`Id` ,
`Username` ,
`Password`
)"."
VALUES (
'".$largest."', '".$user."', '".$pass."'
);");
问题: 现在,如果我删除Id = 1的行,然后重新输入数据,那么它应该使用ID = 1然后再次重新插入它使用的数据ID = 5
它的工作方式如下: 如果我删除Id = 1的行,然后重新输入数据,它获得的Id是5但是1是免费的,
我应该写什么来执行该任务。
答案 0 :(得分:1)
首先,如果您将Id
列设置为AUTO_INCREMENT
,则根本不需要代码中的以下部分:
$fetchid = mysql_query(" SELECT MAX(Id) As max From user;");
$row = mysql_fetch_array($fetchid);
$largest = $row['max'];
$largest++;
因为AUTO_INCREMENT
会自动为您的ID colume添加新值。
但如果您未将其设置为AUTO_INCREMENT
,则上述代码将获取MAXIMUM ID值(在本例中为4)。
删除第1行后再次重新输入数据时,MAXIMUM ID仍为4,因此您的新ID值将为5(来自$largest++;
)。
.....
如果您确实需要在PK时使用连续ID,则需要重新编写代码,但我建议您使用UUID作为ID列。
您可以使用uuid()
轻松生成UUID。
UUID性能如何?请参阅Dancrumb关于此的答案:
编辑:我不建议你在整个表上运行查询只是为了在每次插入新值之前找到MAX ID值,因为它会给你带来性能损失(想象一下,如果你有百万行,必须每次查询它们只是为了插入一个新行,工作量会给你的服务器带来多少)。UUID是一种通用唯一ID。这是你应该在这里考虑的普遍部分。
你真的需要这些ID是普遍独一无二的吗?如果是,那么UUID 可能是你唯一的选择。
我强烈建议如果您使用UUID,则将它们存储为 数字而不是字符串。如果你有50M +记录,那么保存 在存储空间将提高您的表现(虽然我不能 说多少)。
如果你的身份证不需要普遍独特,那我就不会想 你可以做得更好,然后只使用auto_increment,这 保证ID在表中是唯一的(因为值 每次都会增加)
最好像INSERT那样执行INSERT,不多于此。
EDIT2:
如果你真的想使用连续的ID,那么这个解决方案呢?
创建新的TABLE仅用于存储插入的ID(新ID和您删除的ID)。
例如:
CREATE TABLE cons_ids (
ids INT PRIMARY KEY,
is_marker TINYINT DEFAULT 0
);
然后使用1-100的值初始ID,并将标记设置为' 1'在一些位置,例如整张桌子的第80个。这个'标记'用于填写你的ID,几乎是空的。
当您需要将新ID转换为第一个表时,请使用:
$result = mysql_query("SELECT ids, marker FROM cons_ids ORDER BY ids ASC LIMIT 1;");
$row = mysql_fetch_row($result);
并使用$ row [0]代码:
INSERT INTO yourtable (Id, Username, Password)
VALUES ($row[0], $username, $password);
DELETE FROM cons_ids
WHERE ids = $row[0];
此代码会自动将cons_ids中的最小数字作为您的Id插入,并将其从cons_ids表中删除。 (所以下次插入时,它将是下一个最低的数字)
然后使用此代码:
if ($row[1] == 1) {
//add new 100 ids start from the highest ids number in cons_ids table
//and set new marker to 80th position again
}
现在每次从第一个表中删除一行时,只需将删除的行中的Id添加到cons_ids,再次执行INSERT时,它将使用您刚刚删除的ID号。
例如:你在cons_ids中的当前ID是46-150,你从第一个表中删除Id = 14的行,这14个将添加到你的cons_ids,值将变为14和46-150。因此,下次您插入第一张表时,您的ID将为14 !!。
希望我的小技巧可以帮助你解决问题:)
P.S。这只是一个示例,您可以对其进行修改以提高其性能。
答案 1 :(得分:0)
首先,据我所知,您选择的是最高列ID,它应该始终是最后一列(因为您在ID列上设置了自动增量)。
但是你想要做的是在删除查询后填补漏洞,对吗?
如果您真的在寻找这样的方法,请尝试通过创建新的布尔列来跳过删除操作,如果它处于活动状态(true / false),则标记记录。
SQL表更改:
Id Username Password Active
1 admin admin false
2 jay jay1 true
3 suman xyza false
4 chintan abcde true
PHP请求:
$fetchid = mysql_query(" SELECT MIN(Id) As min FROM user WHERE active = false;");
$result = mysql_query(" INSERT INTO `proshell`.`user` (
`Id` ,
`Username` ,
`Password`
`Active`
)"."
VALUES (
'".$largest."', '".$user."', '".$pass."', 'true'
);");