微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 令人费解的“重复键”错误(PostgreSQL)

首先,让我说我理解关系理论,我和 MySQL中的任何人一样称职,但我是一个完整的Postgresql菜鸟.

当我尝试将新记录插入到我的服务表中时 – 仅在生产中 – 我得到了这个:

ActiveRecord::RecordNotUnique (PGError: ERROR:  duplicate key value violates unique constraint "service_pkey"
: INSERT INTO "service" ("created_at","name","salon_id","updated_at") VALUES ('2011-02-28 02:34:20.054269','Manicure',1,'2011-02-28 02:34:20.054269') RETURNING "id"):
  app/controllers/services_controller.rb:46
  app/controllers/services_controller.rb:45:in `create'

我不明白为什么.它不应该为我自动增加PK吗?

这是表定义:

snip=> \d service
                                     Table "public.service"
   Column   |            Type             |                      Modifiers                       
------------+-----------------------------+------------------------------------------------------
 id         | integer                     | not null default nextval('service_id_seq'::regclass)
 name       | character varying(255)      | 
 salon_id   | integer                     | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "service_pkey" PRIMARY KEY,btree (id)

这是开发中同一个表的定义,它可以正常工作:

snip_development=> \d service
                                     Table "public.service"
   Column   |            Type             |                      Modifiers                       
------------+-----------------------------+------------------------------------------------------
 id         | integer                     | not null default nextval('service_id_seq'::regclass)
 name       | character varying(255)      | 
 salon_id   | integer                     | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "service_pkey" PRIMARY KEY,btree (id)

一样!那可能是什么呢?

解决方法

您可能使用数据加载了表,但忽略了将service_id_seq的当前值设置为必需值.您可以只选择SELECT * FROM service_id_seq来检查当前值,并使用setval函数重置它.

例如,SELECT setval(‘service_id_seq’:: regclass,MAX(id))FROM服务;应该将序列重置为表中的当前最大值.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐