我使用postgresql和yii2框架。好吧,我得到了一个非常有趣的错误消息:
SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, 1, null, null, null, null, 1, Demo, , , , 1998-01-01, , , , 345345435453453, , , , , 1, , , f, f, f, f, 10, f, 1, f, f, f, null, null, null, 1470477479, 1470477479, null).
但是我检查了我的插入命令,并且那里没有“ id”列!
INSERT INTO "advertiser" ("languages", "type", "name", "display_name", "title", "about", "birthday", "gender", "country_id", "county_id", "city_id", "city_part", "street", "house_number", "phone", "public_email", "public_url", "motto", "message", "im_facebook", "im_skype", "has_viber", "has_whatsapp", "has_sms_response", "visible_birthday", "is_checked", "status", "version", "user_id", "created_at", "updated_at") VALUES (NULL, 1, 'Demo', '', '', '', '1998-01-01', 1, NULL, NULL, NULL, '', '', '', '345345435453453', '', '', '', '', '', '', FALSE, FALSE, FALSE, FALSE, FALSE, 10, NULL, 1, 1470477479, 1470477479) RETURNING "id"
因此,我真的无法理解此错误消息。我没有发现Postgres或Yii尝试插入空ID值或其他值。
顺便说一下,您可以找到结构
Table "public.advertiser" Column | Type | Modifiers | Storage | Stats target | Description -----------------------+------------------------+---------------------------------+----------+--------------+------------- id | integer | not null | plain | | user_id | integer | | plain | | country_id | integer | | plain | | county_id | integer | | plain | | city_id | integer | | plain | | district_id | integer | | plain | | type | smallint | | plain | | name | character varying(255) | not null | extended | | display_name | character varying(255) | default NULL::character varying | extended | | title | character varying(255) | default NULL::character varying | extended | | about | text | | extended | | birthday | date | not null | plain | | city_part | character varying(255) | default NULL::character varying | extended | | street | character varying(255) | default NULL::character varying | extended | | house_number | character varying(20) | default NULL::character varying | extended | | phone | character varying(15) | not null | extended | | public_email | character varying(255) | default NULL::character varying | extended | | public_url | character varying(255) | default NULL::character varying | extended | | motto | character varying(255) | default NULL::character varying | extended | | message | text | | extended | | gender | smallint | not null default 1 | plain | | im_facebook | character varying(255) | default NULL::character varying | extended | | im_skype | character varying(255) | default NULL::character varying | extended | | has_viber | boolean | not null default false | plain | | has_whatsapp | boolean | not null default false | plain | | has_sms_response | boolean | not null default false | plain | | visible_birthday | boolean | not null default false | plain | | status | smallint | not null default 10 | plain | | is_checked | boolean | not null default false | plain | | geo_latitude | double precision | | plain | | geo_longitude | double precision | | plain | | languages | integer[] | | extended | | created_at | integer | | plain | | updated_at | integer | | plain | | version | bigint | default 0 | plain | | Indexes: "advertiser_pkey" PRIMARY KEY, btree (id)
你有什么建议?我应该在哪里寻找问题?
您没有为插入值id。由于您没有显式设置它,所以它隐式地提供了一个null值,这当然不是主键列的有效值。通过将此列定义为serial而不是普通的old integer,可以避免整个情况,并将所有繁重的工作留给数据库。
id
null
serial
integer