簡體   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