繁体   English   中英

MySQL的auto_increment加一定数量

[英]MySql auto_increment plus a certain number

我希望我表中的id字段比连续数字更具“随机性”。

有没有一种方法可以在id字段中插入一些内容,例如+9,这将告诉db使用当前的auto_increment值并将其添加9?

您有设计缺陷。 不用理会自动递增,并改组查询结果(获取数据时)

尽管这通常用于解决复制问题,但是您可以为auto_increment设置一个增量值:

auto_increment_increment

由于这既是会话设置,又是全局设置,因此您只需在插入之前设置会话变量即可。

除此之外,您可以通过使用MAX()获取当前值,然后添加所需的任何数字并插入该值来手动执行此操作。 如果您尝试插入重复值,MySQL会通知您。

据我所知,不可能“改组”您当前的ID。 如果您愿意,将来可以使用非线性ID。

以下是用PDO编写的,有mysqli等效项

这只是一个任意的INSERT语句

$name = "Jack";
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$sql = "INSERT INTO tableName (name) VALUES(:name)";
$q = $conn->prepare($sql);
$q->execute(':name' => $name);

接下来,我们使用lastInsertId()返回最后插入的行的ID,然后将结果连接到rand()

$lastID = $conn->lastInsertId();
$randomizer = $lastID.rand();    

最后,我们使用“改组” ID并UPDATE之前插入的记录。

$sql = "UPDATE tableName SET ID = :randomizer WHERE ID=:lastID ";
$q = $conn->prepare($sql);
$q->execute(array(':lastID' => $lastID , ':randomizer' => $randomizer));

一个想法..(未测试)

  1. CREATE TRIGGER 'updateMyAutoIncrement'
  2. BEFORE INSERT
  3. ON '数据库名称'。'表名称'
  4. FOR EACH ROW
  5. BEGIN
  6. DECLARE aTmpValueHolder INT DEFAULT 0;
  7. SELECT AUTO_INCREMENT INTO aTmpValueHolder
  8. FROM INFORMATION_SCHEMA.TABLES
  9. WHERE TABLE_SCHEMA = '数据库名称'
  10. AND TABLE_NAME = 'TableName' ;
  11. SET NEW .idColumnName = aTmpValueHolder + 9;
  12. END

编辑:如果上述触发器不起作用,请尝试将AUTO_INCREMENT值直接更新到系统的架构中。 但正如Eric所指出的那样,您的设计似乎存在缺陷。 我看不到在这里自动增加的意义。

编辑2:对于更多的“随机”和较少的线性数。

  1. SET NEW .idColumnName = aTmpValueHolder + RAND(10);

编辑3:正如Jack Williams指出的那样, Rand()产生一个介于0和1之间的float值。因此,要产生一个整数,我们需要使用floor函数将“随机”浮点数转换为整数。

SET NEW .idColumnName = aTmpValueHolder + FLOOR(a + RAND() * (b - a));

其中a和b是随机数的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM