2016-03-08 249 views
4

我只是迁移我的应用程序从mysqlpostgres但是当我尝试在一个特定的表中插入一条记录,我得到violates not-null constraint错误:错误:在列“ID”空值违反非空约束

ERROR: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, 1, 1, null, null, null, 2016-03-09 09:24:12.841891, 2012-12-31 23:00:00, 2012-12-31 23:00:00, null, null, f, null, f, XYZAssignment, null, null, null, null). 

********** Error ********** 

    ERROR: null value in column "id" violates not-null constraint 
    SQL state: 23502 
    Detail: Failing row contains (null, 1, 1, null, null, null, 2016-03-09 09:24:12.841891, 2012-12-31 23:00:00, 2012-12-31 23:00:00, null, null, f, null, f, XYZAssignment, null, null, null, null). 

当我尝试使用factory_girl创造了纪录:

@assignment = FactoryGirl.create(:assignment) 

它建立这个SQL查询:

INSERT INTO assignments(
      id, account_id, l_id, viewed_at, accepted_at, declined_at, 
      expires_at, created_at, updated_at, decline_reason, decline_reason_text, 
      promotion, c_checked_at, forwardable, type, f_promo, 
      c_check_successful, c_check_api_result, c_check_human_result) 
    VALUES (null, 1, 1, null, null, null, '2016-03-09 09:24:12.841891', '2012-12-31 23:00:00', '2012-12-31 23:00:00', null, null, 'f', null, 'f', 'XYZAssignment', null, null, null, null); 

这是分配的出厂:

FactoryGirl.define do 
    factory :assignment do 
    expires_at 24.hours.from_now 
    account 
    lead 
    end 
end 

这是该表说明:

CREATE TABLE assignments(
    id serial NOT NULL, account_id integer NOT NULL, l_id integer NOT NULL, viewed_at timestamp without time zone, accepted_at timestamp without time zone, declined_at timestamp without time zone, expires_at timestamp without time zone, created_at timestamp without time zone, updated_at timestamp without time zone, decline_reason character varying(16), decline_reason_text character varying(256), promotion boolean NOT NULL DEFAULT false, c_checked_at timestamp without time zone, forwardable boolean DEFAULT true, type character varying(64), f_promo boolean, c_check_successful boolean, c_check_api_result character varying(32), c_check_human_result character varying(32), CONSTRAINT assignments_pkey PRIMARY KEY (id) 
) WITH (
    OIDS=FALSE 
); 

看起来它不能够自动递增的ID,任何想法?

+0

从列表中删除'id'并从值列表中导出'null'。自动增量比直接显式赋值弱。 – mudasobwa

+0

请出示你的作业工厂。 – spickermann

回答

1

你要跳过idINSERT操作:

INSERT INTO assignments(account_id, l_id, ...) 
VALUES 
(1, 1, ...) 

id将自动获得下一个序列号,因为它是一个自动递增字段。

+1

实际上,rails中的ActiveRecord查询传递了null参数,需要检查我是否可以排除该参数。 – tokhi

相关问题