2009-11-30 105 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;