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

标签 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 是空闲的,

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

最佳答案

首先,如果您将 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 列。

但如果您不将其设置为AUTO_INCREMENT,上述代码将获取 MAXIMUM ID 值(在本例中为 4)。

删除第 1 行后再次输入数据时,MAXIMUM ID 仍为 4,因此您的新 ID 值为 5(来自 $largest++;)。

.....

如果你真的需要在 PK 中使用连续的 id,你需要重新编写你的代码,但我建议你使用 UUID 作为你的 ID 列。

您可以使用 uuid() 轻松生成 UUID。

UUID性能如何?引用 Dancrumb 的回答:

A UUID is a Universally Unique ID. It's the universally part that you should be considering here.

Do you really need the IDs to be universally unique? If so, then UUIDs may be your only choice.

I would strongly suggest that if you do use UUIDs, you store them as a number and not as a string. If you have 50M+ records, then the saving in storage space will improve your performance (although I couldn't say by how much).

If your IDs do not need to be universally unique, then I don't think that you can do much better then just using auto_increment, which guarantees that IDs will be unique within a table (since the value will increment each time)

看。 UUID performance in MySQL?


编辑:我不建议您在每次插入新值之前仅在整个表上运行查询以查找 MAX ID 值,因为这会给您带来性能损失(想象一下,如果您有数百万行并且必须查询他们每次只是为了插入一个新行,给您的服务器造成多少工作量)。

最好像INSERT一样做INSERT,仅此而已。


编辑2:

如果你真的想使用连续的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。因此,下次您对第一个表执行 INSERT 时,您的 ID 将为 14!!。

希望我的小技巧能帮助你解决问题:)

附言这只是一个示例,您可以对其进行修改以提高其性能。

关于php - 将值放在升序数据库列之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35357650/

相关文章:

jquery - Bootstrap 3 带子菜单的导航

javascript - 在基于本地文件的应用程序中(文件为 ://)),是否可以使用 AngularJS 进行 HTML5 模式 URL 路由

mysql - Laravel Eloquent 地查询条件下来自另一个表的值的总和

php - 从同一类访问已设置的属性将返回 null

php - 根据产品总数对某些类别进行折扣

php - PayPal 的跟踪 ID

php - 通过php脚本显示png图片

html - Css超链接字体颜色不变

mysql - 按 MYSQL 中搜索次数最多的单词排序

Cocoa 应用程序中的 MySQL 客户端