将值放在升序数据库列之间

时间:2016-02-12 08:11:51

标签: php html mysql database

以下是我在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是免费的,

我应该写什么来执行该任务。

2 个答案:

答案 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关于此的答案:

  

UUID是一种通用唯一ID。这是你应该在这里考虑的普遍部分。

     

你真的需要这些ID是普遍独一无二的吗?如果是,那么UUID   可能是你唯一的选择。

     

我强烈建议如果您使用UUID,则将它们存储为   数字而不是字符串。如果你有50M +记录,那么保存   在存储空间将提高您的表现(虽然我不能   说多少)。

     

如果你的身份证不需要普遍独特,那我就不会想   你可以做得更好,然后只使用auto_increment,这   保证ID在表中是唯一的(因为值   每次都会增加)

见。 UUID performance in MySQL?

编辑:我不建议你在整个表上运行查询只是为了在每次插入新值之前找到MAX 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'
);");