web-dev-qa-db-fra.com

Les références de clés étrangères peuvent-elles contenir des valeurs NULL dans PostgreSQL?

Par exemple

create table indexing_table
(
  id SERIAL PRIMARY KEY,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
);

Y a-t-il une différence entre les tableaux suivants?

Tableau 1:

create table referencing_table
(
  indexing_table_id INTEGER references indexing_table
);

Tableau 2:

create table referencing_table
(
  indexing_table_id INTEGER references indexing_table NOT NULL
);

Alternativement, dans le cas du tableau 1, où il n'y a pas de NOT NULL contrainte, sommes-nous autorisés à insérer des enregistrements contenant NULL valeurs?

17
Alex

Pour le tableau 1, cette instruction INSERT réussira. Si vous l'exécutez 100 fois, il réussira 100 fois.

insert into referencing_table values (null);

La même instruction INSERT échouera sur le tableau 2.

 ERREUR: la valeur nulle dans la colonne "indexing_table_id" viole la contrainte non nulle 
 DÉTAIL: La ligne défaillante contient (null). 

Parfois, vous souhaitez qu'une colonne à clé étrangère soit annulable car elle n'est pas obligatoire (tout comme tous les citoyen dans une table de citoyens ne sont pas allés à l'université, donc un university_id la colonne peut être nulle). Dans d'autres cas, la colonne ne doit pas être nulle, tout comme chaque étudiant l devrait être associé à un university_id.

Par conséquent, les deux referencing_tables que vous décrivez sont en réalité très différents, si vous considérez ce que vous essayez de réaliser.

2
richyen