[英]Postgres error: null value in column "id" - during insert operation
我使用 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 尝试插入 null 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
而不是普通的旧integer
来避免整个情况,并将所有繁重的工作留给数据库。
serial
关键字在解析时展开,之后无法看到。
从Postgresql 10
版本开始,有以下替代方案:
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
它应该符合 SQL 标准,因此与 Oracle 兼容。
有关更多详细信息,请参阅此博客。
在将 PostgreSQL10 转储读取到 9.6 数据库服务器后发生在我身上。 之后,自动创建序列 ID 的序列丢失了。
这可以像这样显示(在 psql 中):
SELECT column_name
, column_default
FROM information_schema.columns
WHERE table_name = 'django_migrations'
ORDER BY
ordinal_position;
其中django_migrations
是表名。 它应该显示如下内容:
column_name | column_default
-------------+-----------------------------------------------
id | nextval('django_migrations_id_seq'::regclass)
[...]
如果 'column_default' 中的值为空,则序列丢失。
将您现有的主键更改为serial
。 阅读此内容以更改它
如果由于客户端、管理、数据库权限等原因而无法更改为serial
...
数据库可能正在使用sequence
。
以下是有关它的信息: SELECT nextval('seq_nuu_filtreelement')
阅读:
我没有设法使pg_catalog.pg_get_serial_sequence('schema.table', 'id')
工作。
因此,我在我的数据库资源管理器中找到了序列并使用命令:
SELECT nextval('seq_table_name')
如果由于某种原因,您无法更改架构以将 id 列的类型从目前的任何类型更改为serialize
; 然后,您可以将 id 与其他值一起插入,如下所示:
(select max(id) + 1 from table)
或者,如果您的 id 列已经有一个序列集,请尝试使用关键字 DEFAULT 而不是 NULL 来插入。
在 MySQL 中,NULL 将使用列的默认值,但在 Postgres 中不是这样。
您的示例查询将更改为:
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 (DEFAULT, 1, 'Demo', '', '', '', '1998-01-01', 1, NULL, NULL, NULL, '', '', '', '345345435453453', '', '', '', '', '', '', FALSE, FALSE, FALSE, FALSE, FALSE, 10, NULL, 1, 1470477479, 1470477479) RETURNING "id"
此答案显示使用 DEFAULT 关键字: insert DEFAULT values
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.