【发布时间】:2015-02-13 04:10:35
【问题描述】:
这是我拥有的种子文件的一部分
Country.create(id: 1, name: 'Turkey', 'description' : 'Gobble gobble')
Country.create(id: 2, name: 'Hungary', 'description' : 'Blah blah blah')
运行后,国家/地区表中有两条记录。
所以现在我通过 Web 界面或 API 尝试创建一个新国家/地区,但我从 Oracle 收到以下错误:
OCIError: ORA-00001: unique constraint
约束在主键上。播种后,它会尝试使用 id 的 1、2 创建接下来的两条记录,但它们已经存在。
我不明白为什么在通过 API 或 Web 界面使用与控制器/模型中相同的代码播种来创建 Country 时,我会得到不同的结果。
如果我通过 SQLDeveloper 使用以下 sn-p 更改序列,一切正常:
ALTER SEQUENCE countries_seq INCREMENT BY 100;
select countries_seq from dual;
ALTER SEQUENCE countries_seq INCREMENT BY 1;
请注意,所有型号都会发生这种情况,我只是以Country 为例。
我正在使用
Ruby 2.1.0
Rails 4.0.5
oracle-enhanced 1.5.5 gem
ruby-oci8 2.1.7 gem
编辑
如果我不将 id 放在创建参数中,一切正常。
Country.create(name: 'Turkey', 'description' : 'Gobble gobble')
Country.create(name: 'Hungary', 'description' : 'Blah blah blah')
很高兴知道为什么...
【问题讨论】:
-
我不知道 Country.create 做了什么,很可能:如果您自己不分配 id,它将由 create 函数或数据库端的触发器设置。您可以检查 tabledefinition 是否有触发器。
-
对不起,如果我错过了,但你在哪里打电话给
countries_seq.nextval? -
@evilive 我认为你是对的。当我提供 id 时,序列不会增加。如果你把它作为答案,我会接受。感谢您的帮助
-
@JamesZaghini 完成 ;)
标签: ruby-on-rails oracle oci8