2009-11-30 114 views
3

我在我的「表類別」中刪除了一行(第20行),請讓我知道如何重新排序catid(主鍵)?此時是21後,19如何重新排序主鍵?

感謝

+2

爲什麼?有什麼關鍵的是有一個關鍵= 19,然後一個關鍵= 21? – 2009-11-30 09:15:32

回答

6

你不能。您可以得到的最接近的是truncate table,這將丟棄表並重新創建它,這意味着您將丟失其中的所有數據,並且ID計數器重置爲0.除此之外,ID將始終從最後插入的記錄中增加1 ,不管這個記錄是否存在。當然,你可以編寫一個查詢來修復所有當前的ID,但是在下一次插入時,它仍然會產生一個新的差距。更重要的是:如果沒有間隙的連續排序是你想要的,那麼自動增量ID不是實現這個目的的正確方法。添加另一個int字段,您可以手動跟蹤此排序。

0

你說的重新排序主鍵是什麼意思?如果你說你想讓主鍵取20而不是21,那麼我擔心你不能這麼做。

所有你能做的,是刪除主鍵約束,然後更改21到20年,重新回到主鍵約束

3

不要混淆主鍵。他們不應該改變,你不應該在你的應用中使用它們來添加表格。

如果您需要無間隙索引,請添加一個新列,並在插入/移除時相應地更新此列。這聽起來像是對你無用的工作,但它會在以後爲你節省很多痛苦。

+0

因此,如果我的應用程序中不應該使用主鍵來進行除了連接表之外的任何操作,那麼在我的應用程序中,我應該如何引用特定的文本,以便在數據庫中查找特定的文本不同語言的文本/句子?我需要使用密鑰才能查看文本。 – HelloGoodbye 2017-10-19 11:23:19

+0

@HelloGoodbye您需要定義一個業務密鑰。在這種情況下,它應該是標識翻譯的東西。我正在使用strings/VARCHAR。該值使用點來創建名稱空間。我有像「app.welcome.message」這樣的固定鍵和「stock.name.4731」這樣的動態鍵,其中「4731」是「股票」表中的主鍵。 – 2017-11-06 13:11:56

+0

啊,所以你使用更多的符號名稱的方法,而不是整個代碼中使用看似隨意的整數?聰明! – HelloGoodbye 2017-11-06 20:38:04

5

如果您關心的主鍵值足夠多,以致此類值不受歡迎,那麼您首先不應該使用自動編號主鍵。

帶有自動編號鍵的整個觀點就是你說「只要關鍵是獨一無二的,我真的不關心它的價值。」

0

大衛是正確的關於不使用主鍵索引等。

如果您只需要更改一次特定的主鍵值(我在遷移過程中有時會這樣做),您當然可以設置identity_insert並使用insert insert來複制該行,然後刪除原來的值。

對於再造一個排序順序或用作您的應用程序,你可以使用下面的存儲過程索引的列:

CREATE PROCEDURE [dbo].[OrganizeOrderConfirmationMessages] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sortOrder INT; 
    SET @sortOrder = 0; 

    -- // Create temporary table 
    CREATE TABLE #IDs(ID INT, SortOrder INT) 

    -- // Insert IDs in order according to current SortOrder 
    INSERT INTO #IDs SELECT ocm.ID, 0 FROM OrderConfirmationMessages ocm ORDER BY ocm.SortOrder ASC 

    -- // Update SortOrders 
    UPDATE #IDs SET SortOrder = @sortOrder, @sortOrder = @sortOrder + 10 

    -- // Update the "real" values with data from #IDs 
    UPDATE OrderConfirmationMessages SET SortOrder = x2.SortOrder 
    FROM #IDs x2 WHERE OrderConfirmationMessages.ID = x2.ID  

END 

結果:

SortOrders的例子會從1,2 ,5,7,10,24,36至10,20,30,40,50,60,70

2

其實你可以。

如果行有足夠的獨特數據和您使用phpMyAdmin

  1. 與主ID
  2. READD與主鍵和自動遞增列啓用刪除列。

現在,它的使用!

+0

該死Intelligent..smart辦法第一章 – khandelwaldeval 2014-05-06 11:19:05

3

試試這個:

UPDATE tbl SET catid = (SELECT COUNT(*) FROM tbl t WHERE t.catid <= tbl.catid); 

您可能還需要重新思考/重新設計。在刪除一行時重新編號整個表似乎不太實際或不必要。

0

你應該放棄了「CATID」字段,然後重新創建它,將其設置爲初級和檢查自動遞增複選框,這將增加新的領域,並填補了數字。

0

首先從表中刪除主鍵列在你的phpmyadmin的SQL中─ ALTER TABLE 'your_tablename' 運行這個命令添加 '列名' BIGINT NOT NULL AUTO_INCREMENT首先,添加PRIMARY KEY ( '列名'(10) );

這將自動地從0,1等等安排在數列。

0

試試這個:

SET @var:= 0; UPDATE table SET id =(@ var:= @ var + 1); ALTER TABLE table AUTO_INCREMENT = 1;