Postgres truncate restart identity不会重启身份

时间:2014-06-25 19:02:31

标签: postgresql

就像话题所说的那样。

truncate table "Account" restart identity cascade;
insert into "Account" ("name", "enabled") values ("test", 1);
select * from "Account";

输出:

 accountId | name | enabled
-----------+------+---------
        14 | test |       1
(1 row)

这是表的架构:

                                       Table "public.Account"
  Column   |          Type          |                           Modifiers
-----------+------------------------+---------------------------------------------------------------
 accountId | integer                | not null default nextval('"Account_accountId_seq"'::regclass)
 name      | character varying(255) | not null
 enabled   | integer                | not null
Indexes:
    "Account_pkey" PRIMARY KEY, btree ("accountId")
Referenced by:
    TABLE ""AccountPropertyAccess"" CONSTRAINT "AccountPropertyAccess_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "Account"("accountId")
    TABLE ""User"" CONSTRAINT "User_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "Account"("accountId")

这里有一些额外的词,因为堆栈交换认为我没有足够的单词,因为我有太多的代码。

2 个答案:

答案 0 :(得分:4)

您似乎没有将列创建为serial列,因此Postgres不知道序列"属于"到列,因此"重新启动身份"不会重置序列。

您可以通过使用serial而不是integer重新创建表格以及默认值来解决此问题。

或者你可以告诉Postgres列"拥有"顺序:

alter sequence "Account_accountId_seq" owned by "Account"."accountId";

顺便说一句:使用带引号的标识符通常比它的价值要麻烦得多(根据我的经验)。大多数情况下,最好不要使用带引号的标识符,例如create table Account (...)代替create table "Account" (...)

答案 1 :(得分:2)

看起来你有一个自动增量序列id。你也需要重置它。

PostgreSQL文档shows

ALTER SEQUENCE Account RESTART WITH 1;

关于它,有几个问题herehere