簡體   English   中英

如何使用 PHP 為 MySQL 表中的每一行重新分配 AUTO_INCREMENT 列

[英]How to re-assign AUTO_INCREMENT column for every row in a MySQL table using PHP

我有一個圖片庫,網站成員可以將圖片上傳到該圖片庫。 上傳圖片時,會寫入 MySQL 行,包含圖片、會員等各種信息。該行使用 AUTO_INCREMENT 創建其 ID,以便getimage.php?id=XX獲取要顯示的圖片.

我使用 for 循環遍歷 ID 以顯示圖庫中的圖像。

例如,如果我刪除第 5 行/圖像,則 AUTO_INCREMENT 從123456789變為12346789

我想從頭開始為 MySQL 表中的每一行重新分配 ID。 所以 12346789 變為 12345678。我將如何實現這一點?

我發現它可以完美且快速地工作,所以這里是:

ALTER TABLE tablename DROP id

ALTER TABLE tablename ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1

我知道這不是正確的方法,但是對於我的具體情況,這正是所需要的。 我正在使用的表中沒有任何內容可以從另一個表引用或引用到另一個表。

如果您希望自動遞增的 id始終是連續的,讓它 go,這是一個無用的斗爭。

如果您只想重新編號一次,這很容易:

創建一個具有相同布局的新表:

CREATE TABLE mytable2 LIKE oldtable;

將所有行復制到新表中,記住不要select auto_incrementing id,否則會保留舊編號。

INSERT INTO mytable2 (field2, field3, field4)
  SELECT field2, field3, field4 FROM oldtable ORDER BY oldtable.id;

RENAME oldtable archive;

RENAME mytable2 oldtable;

DROP archive;

您現在有連續編號。

使用用戶定義的變量

SET @id = 0;
UPDATE table SET id = @id := @id + 1 ORDER BY id;
SET @alt = CONCAT('ALTER TABLE table AUTO_INCREMENT = ', @id + 1);
PREPARE aifix FROM @alt;
EXECUTE aifix;
DEALLOCATE PREPARE aifix;

示例使用

正如其他已經說過的,這是錯誤的方法,但如果您需要重新編號(例如,它對排序列有效),這里是查詢:

UPDATE tabaleName SET fieldName = fieldName - 1 WHERE fieldName > 5 ORDER BY fieldName ASC

而且由於您使用的是自動增量,因此您必須重置它

ALTER TABLE tableName AUTO_INCREMENT=10000

但請注意,我僅出於教育目的發布此內容。 這是錯誤的方法,當您單擊下一個/上一個時,不要在查詢中提供確切的 ID,而是執行

SELECT * FROM tableName WHERE fieldName > _the_previous_id_ 
ORDER BY fieldName ASC LIMIT 1

或者更好的是,select 專輯中的所有記錄,並循環它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM