web-dev-qa-db-fra.com

Comment utiliser la valeur par défaut du type de données comme colonne par défaut?

Comment puis-je spécifier la valeur par défaut d'une colonne dans la DDL? J'étais à peu près sûr que la méthode suivante fonctionnait il y a quelque temps:

CREATE TABLE test
(
  col_1 CHAR(12) NOT NULL,
  col_2 INTEGER  NOT NULL WITH DEFAULT,
  col_3 CHAR(12) NOT NULL WITH DEFAULT
);

Je voudrais juste définir que la base de données doit utiliser la valeur par défaut pour le type de données de colonne (comme dans mon exemple ci-dessus), sans spécifier exactement quelle valeur.

4
user3193317

La valeur par défaut par défaut pour toute nouvelle colonne de table est la valeur par défaut du type de données.

Et la valeur par défaut par défaut pour les types de données est NULL - ce qui est le cas pour tous les types de données de base dans Postgres. Mais toute valeur valide est autorisée pour les types ou domaines personnalisés.

Le manuel sur CREATE TYPE:

Une valeur par défaut peut être spécifiée, dans le cas où un utilisateur souhaite que les colonnes du type de données par défaut soient différentes de la valeur nulle. Spécifiez la valeur par défaut avec la clé DEFAULT. (Une telle valeur par défaut peut être remplacée par une clause explicite DEFAULT attachée à une colonne particulière.)

Le manuel sur CREATE DOMAIN:

L'expression par défaut sera utilisée dans toute opération d'insertion qui ne spécifie pas de valeur pour la colonne. Si une valeur par défaut est définie pour une colonne particulière, elle remplace toute valeur par défaut associée au domaine. À son tour, la valeur par défaut du domaine remplace toute valeur par défaut associée au type de données sous-jacent.

Vous utilisez uniquement la clause DEFAULT pour les colonnes dans CREATE TABLE pour spécifier une valeur par défaut différente. Sinon, vous ne faites rien WITH DEFAULT comme vous le voyez dans la question n'est pas valable dans Postgres

Pour réinitialiser une colonne par défaut à par défaut par défaut du type de données (généralement NULL), drop la valeur par défaut spécifiée de la colonne.

Le manuel sur ALTER TABLE:

ALTER [ COLUMN ] column_name DROP DEFAULT

NOT NULL Contraintes sont liés mais complètement indépendants. Une colonne définie NOT NULL Et sans DEFAULT personnalisé (et sans valeur par défaut non nulle pour le type) vous oblige à fournir une valeur non nulle pour chaque INSERT.


En plus: vous ne voulez probablement pas utiliser le type de données char(12) dans Postgres.

7
Erwin Brandstetter

Vous devez spécifier quelle est la valeur par défaut. Si je me souviens bien, la contrainte par défaut devrait être avant NOT NULL:

CREATE TABLE test
( col_1 CHAR(12) NOT NULL,
  col_2 INTEGER DEFAULT 0 NOT NULL,
  col_3 CHAR(12) DEFAULT '' NOT NULL
);
3
Lennart