J'utilise les frameworks postgresql et yii2 ..__ J'ai reçu un message d'erreur très intéressant:
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).
Mais j'ai vérifié ma commande Insérer, et il n'y a pas de colonne "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"
Donc, je ne peux vraiment pas comprendre ce message d'erreur. Je ne trouve pas que le Postgres ou Yii essayent d'insérer une valeur d'identifiant nulle ou quoi.
À propos ici vous pouvez trouver la structure
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)
Quel est ton consseille? Où devrais-je chercher le problème?
Vous n'insérez pas de valeur pour id
. Étant donné que vous ne le définissez pas explicitement, une valeur null
lui est implicitement attribuée, ce qui, bien sûr, n'est pas une valeur valide pour une colonne de clé primaire. Vous pouvez éviter toute cette situation en définissant cette colonne comme suit: serial
au lieu d'un ancien integer
et en laissant tout le poids lourd à la base de données.
Le mot clé serial
est développé au moment de l'analyse et ne peut plus être vu par la suite.
A partir de la version Postgresql 10
, il existe l'alternative suivante:
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
Il est supposé se conformer au standard SQL et donc être compatible avec Oracle.
Voir ce blog pour plus de détails.
Changez votre clé primaire existante en serial
. Lisez ceci pour le changer