如何重新订购主键?

时间:2009-11-30 08:26:43

标签: primary-key

我在“表格类别”中删除了一行(第20行),请让我知道如何重新排序catid(主键)?此时19岁之后是21岁。

由于

11 个答案:

答案 0 :(得分:6)

你做不到。你可以得到的最接近的是truncate table,它将删除表并重新创建它,这意味着你丢失了所有数据,并且ID计数器被重置为0.除此之外,ID将始终从最后插入的记录,无论该记录是否仍然存在。当然,您可以编写一个查询来修复所有当前ID,但是在下次插入时,它仍然会创建一个新的差距。更重要的是:如果您想要的顺序排序没有间隙,自动增量ID不是实现这一目标的正确方法。添加另一个int字段,您可以手动跟踪此顺序。

答案 1 :(得分:5)

如果您对主键值非常关注这些值是不需要的,那么您不应该首先使用自动编号主键。

使用自动数字键的重点是,您说“只要密钥是唯一的,我就不关心它的价值。”

答案 2 :(得分:3)

不要弄乱主键。它们永远不应该改变,你不应该在你的应用程序中使用它们,除了加入表格之外的任何东西。

如果需要无间距索引,请添加新列,并在执行插入/删除时相应地更新此列。这对你来说听起来像是无用的工作,但它会在以后为你节省很多痛苦。

答案 3 :(得分:3)

试试这个:

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

您可能还想重新考虑/重新设计。删除行时重新编号整个表似乎不太可行或不必要。

答案 4 :(得分:2)

其实你可以。

如果您的行具有足够的唯一数据并且您正在使用PHPmyAdmin

  1. 删除包含主ID的列
  2. 阅读启用了主键和自动增量的列。

答案 5 :(得分:0)

重新排序主键是什么意思?如果你说主键需要20而不是21,那么我担心你不能直接做到这一点。

您可以做的就是删除主键约束,然后将21更改为20,然后重新应用主键约束

答案 6 :(得分:0)

David没有使用主键进行索引等。

如果你只需要更改一次特定的主键值(我有时在迁移过程中就完成了),你当然可以设置identity_insert并使用insert select复制该行,然后删除原始行。< / p>

要在应用程序中重新创建用作索引的排序顺序或列,可以使用以下存储过程:

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

答案 7 :(得分:0)

您应该删除'catid'字段,然后再次创建它,将其设置为primary并选中Auto Increment复选框,它将添加新字段并填充数字。

答案 8 :(得分:0)

首先从表中删除主键列并在phpmyadmin sql部分中运行此语法 -

ALTER TABLE 'your_tablename' ADD 'column_name' BIGINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY
('column_name' (10));

这将自动按0,1等的数字排列列。

答案 9 :(得分:0)

试试这个:

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

答案 10 :(得分:0)

在postgres中,您可以在记录数<300:

处执行此操作
update schema.tbl1
set tbl_id = tbl_id + 300;

alter sequence schema.tbl1_id_seq
restart with 1;

insert into schema.tbl1
select nextval('schema.tbl1_id_seq'),
column2,
column3
from schema.tbl1;

delete from schema.tbl1
where tbl1_id > 300;