【问题标题】:Reorganize ID of tables in postgreSQL so that the ID starts again at 1?在 postgreSQL 中重新组织表的 ID 以便 ID 再次从 1 开始?
【发布时间】:2021-11-22 22:02:56
【问题描述】:

您好,我目前正在使用 python 和 postgreSQL 尝试不同的数据自动化过程。我将具有 40.000 个数据项的数据集自动清理并上传到我的数据库中。由于我的过程中存在一些缺陷,我不得不截断一些表格或数据条目。


我正在使用:python 3.9.7 / postgeSQL 13.3 / pgAdmin 4 v.5.7

问题

目前我有从 ID 44700 而不是 1 开始的表的 ID(由于我的编辑)。

例如,火车站表以 ID 41801 开始,以 ID 83599 结束。

问题

如何重新组织我的索引,使 ID 从 1 开始到 41801?

在网上查找后,我发现了诸如“膨胀”或“重新索引”之类的主题。我厌倦了 Vacuum 或 Reindex,但我的桌子没有真正显示出不同?就目前而言,我的表彼此之间没有任何关系。在 postgreSQL 中解决我的问题的方法是什么。我忽略了一些隐藏的功能?也许这根本不是问题,但它肯定看起来很奇怪。在某个时间点,我的 ID 为 250.000,而我的表中只有 40.000 个数据条目。

【问题讨论】:

    标签: database postgresql indexing pgadmin-4 postgresql-13


    【解决方案1】:

    您是否使用序列来生成表的 ID 列?如果您的数据库中有一个 Sequence 对象,您可以在数据库下的 pgAdmin 中检查它:Schemas -> public -> Sequences。

    您可以通过右键单击序列来更改当前序列号并将其设置为“1”。但只有在您删除了表中的所有行并且在您再次开始导入数据之前才执行此操作。

    只要您没有引用您的火车站表的 ID 列的任何其他表,您甚至可以使用如下更新语句更新 ID:

    UPDATE trainStations SET ID = ID - 41801 WHERE 1 = 1;
    

    【讨论】:

    • Schemas -> public -> 序列对我不起作用,我没有序列。但我用一个小型火车代理表(37 行)尝试了你的代码行。我第一次以ID 0 结束。但我发现无论你的第一个id 是什么,例如500 取'- 499' 然后它以ID 1 开头。我不太了解WHERE 1 = 1。我尝试了一些了解并混合表格。但作为一个副作用,我发现truncate restart identity 也可以完成这项工作,而truncatestarts 的最后一个 ID `truncate restart identity``以 1 开头。谢谢
    • where 1 = 1 只是对表的所有行强制执行更新语句,显然 1 始终等于 1。
    • 所以where 20 = 20 等于每二十行更新一次?这就是为什么我最终得到未排序的数字。内部很棒,以后会用到。
    • 不!那不是真的,不要这样做! 20 = 20 的行为与 1 = 1 完全相同,因为两者都导致 true。在任何 UPDATE 语句中添加 WHERE 子句是常见的用法。通常,如果您只想更新一个特定的行,您将有一个 WHERE 子句,如WHERE ID = <FooId>。但是由于您想更新每一行,您只需给出一个始终评估为 true 的条件,例如 WHERE 1 = 1 甚至 WHERE 841 = 841
    • 是的,也许你也可以只使用WHERE true,但是这可能在MsSQL中不起作用。所以WHERE 1 = 1 更加独立于数据库。我已经开始在我的更新语句中总是有一个 WHERE 子句,也是作为预防措施,因为如果您忘记添加它,您将操纵整个表,即使您最初只想更新一行。然后你只能希望有一个可用的备份,否则你就完蛋了。它只发生在我们每个人身上一次;)
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2019-07-02
    • 2020-05-30
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多