我在“表格类别”中删除了一行(第20行),请让我知道如何重新排序catid(主键)?此时19岁之后是21岁。
由于
答案 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
答案 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;