Postgres erreur: valeur null dans la colonne “id” - pendant l'opération d'insertion
J'utilise postgresql et yii2 cadre.
Eh bien j'ai eu un très intéressant message d'erreur:
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 Insert, et il n'y a pas de "id" de la colonne il y!
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"
Je ne comprends donc pas ce message d'erreur. Je ne trouve pas que la Postgres ou Yii essayez d'insérer une valeur null valeur de l'ID ou quoi.
Par la voie 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 votre avis? Où dois-je regarder pour le problème?
OriginalL'auteur Dabagab | 2016-08-06
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas à l'insertion d'une valeur de
id
. Puisque vous n'avez pas explicitement définie, il est implicitement donné unnull
valeur, ce qui est, bien sûr, n'est pas une valeur valide pour une colonne de clé primaire. Vous pouvez éviter cette situation tout en définissant cette colonne commeserial
au lieu d'un simple vieuxinteger
, et de laisser tout le levage lourd pour la base de données.OriginalL'auteur Mureinik
La
serial
mot-clé est élargi au moment de l'analyse et ne peut pas être vu par la suite.À partir de la version
Postgresql 10
il y a l'alternative suivante:Il est censé être conforme à la norme SQL et donc être compatible avec Oracle.
Voir ce blog pour plus de détails.
OriginalL'auteur Stephane
Modifier votre clé primaire de
serial
. Lisez ceci pour en changerModification de la clé primaire de type int à la série
OriginalL'auteur vipin cp
Si vous ne pouvez pas changer de
serial
parce que des raisons, comme client, gestion de la db des droits de l'...La base de données est probablement à l'aide de
sequence
.Voici ce qu'il faut savoir à ce sujet :
SELECT nextval('seq_nuu_filtreelement')
À lire :
Je n'ai pas réussi à faire
pg_catalog.pg_get_serial_sequence('schema.table', 'id')
travail.Donc j'ai trouvé les séquences dans mon explorateur de base de données et utiliser la commande :
SELECT nextval('seq_table_name')
OriginalL'auteur Poutrathor