2017-10-16 3 views
0

I ont le schéma de base de données suivant dans MySQL, que nous avons répliqué dans PostgreSQL en utilisant un ORM:Insertion valeur NULL aux champs de timestamp dans postgreqSQL

CREATE TABLE IF NOT EXISTS users (
id    BIGINT NOT NULL DEFAULT NEXTVAL ('users_seq'), 
email   VARCHAR(255) NOT NULL DEFAULT '', 
password   VARCHAR(255) NOT NULL DEFAULT '', 
last_name  VARCHAR(255) NOT NULL DEFAULT '', 
first_name  VARCHAR(255) NOT NULL DEFAULT '', 
created   TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, 
updated   TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (id) 

);

Et je suis en train d'exécuter la requête suivante

INSERT INTO users (id, email, password,first_name, last_name, created, updated) 
VALUES (1, '[email protected]', 'pass', 'user', 'user', NULL, NULL); 

Il en résulte une erreur

ERROR: null value in column "created" violates not-null constraint 

Comportement attendu est d'avoir l'horodatage en cours dans le cas où la valeur est NULL, et fonctionne en MySQL

J'utilise PostgreSQL 10. Ai-je manqué une configuration ou n'est-ce pas supporté dans Postgres?

+0

Enlever postgres des étiquettes s'il vous plaît. si vous voulez une valeur par défaut, sautez la colonne de la liste - si vous spécifiez explicitement 'NULL' - elle sera inerte NULL, pas' DEFAULT' –

+0

autorisez null pour les champs 'created' et' updated', vous essayez d'insérer null dans champs non nullables. Seule la valeur par défaut sera insérée si votre requête d'insertion n'a pas ce champ. – Bharat

+0

@VaoTsun Pourquoi supprimer la balise postgres ?. Ceci est supporté par mysql. Cette requête est générée à partir d'une bibliothèque ORM. – Anuruddha

Répondre

2

NULL est différent de "default".

Lorsque vous spécifiez NULL dans votre liste de valeurs à insérer, Postgres tente d'insérer un NULL dans cette colonne de la table. S'il y a une contrainte qui empêche cela, comme un spécificateur NOT NULL sur la colonne, l'insertion échouera. si aucun défaut est spécifié

Si, cependant, vous ne spécifiez pas une valeur pour cette colonne, Postgres insérera la valeur par défaut pour cette colonne, ou NULL.

Par conséquent, étant donné que vous avez DEFAULT valeurs sur ces deux colonnes, vous pouvez écrire ceci:

INSERT INTO users (id, email, password,first_name, last_name) 
VALUES (1, '[email protected]', 'pass', 'user', 'user'); 

qui signifie effectivement la même que celle-ci:

INSERT INTO users (id, email, password,first_name, last_name, created, updated) 
VALUES (1, '[email protected]', 'pass', 'user', 'user', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); 

Notez qu'il est parfaitement légal pour avoir une colonne qui accepte à la fois NULL et a une valeur par défaut. Si vous essayez d'insérer un NULL toujours inséré la valeur par défaut, cela serait impossible (ou, au moins, inutilement compliqué).