CLÉ PRIMAIRE Composite applique les contraintes not NULL sur les colonnes concernées

C'est un étrange, un comportement non désiré, j'ai rencontré dans Postgres:
Lorsque je crée une Postgres tableau avec les clés primaires composites, il applique une contrainte not NULL sur chaque colonne de la combinaison composite.

Par exemple,

CREATE TABLE distributors (m_id integer, x_id integer, PRIMARY KEY(m_id, x_id));

applique NOT NULL contrainte sur les colonnes m_id et x_id, que je ne veux pas!
MySQL ne fait pas cela. Je pense que l'Oracle ne pas le faire aussi bien.

Je comprends que PRIMARY KEY applique UNIQUE et NOT NULL automatiquement, mais qui fait sens pour une seule colonne de clé primaire. Dans un multi-colonne de clé primaire de la table, l'unicité est déterminée par la combinaison.

Est-il un moyen simple d'éviter ce comportement de Postgres?

Si j'exécute ce:

CREATE TABLE distributors (m_id integer, x_id integer);

Je n'ai pas tout NOT NULL contraintes de cours.

  • Bien: c'est le standard. Imaginez deux tuples présents, à la fois avec x_id = NULL. Maintenant, si vous voulez mettre à jour l'un de ces, vous ne seriez pas en mesure de traiter un seul, qui serait en violation de 2FN. (tout cela parce que: NULL n'est pas une valeur) Remarque que pour le SGBD au ddl-temps, il y a deux choix: soit en refusant de la définition, ou la conversion de la clé des champs à ne pas accepter les valeurs null automatiquement.
  • Je vois ce que vous dites. Je suis en train de migrer de MySQL à Postgresql et donc cette incohérence causes d'un problème. Pouvez-vous donner plus de détails sur "Notez que pour le SGBD au ddl-temps, il y a deux choix: soit en refusant de la définition, ou la conversion de la clé des champs à ne pas accepter les valeurs null automatiquement."
  • Il est illégal définition. Si le SGBD peut la refuser. Ou de le corriger. (Vous avez pu le comparer à un compilateur C confronté à la définition int i=1.0; )
  • Vous êtes dans l'erreur. MySQL, Oracle, SQL-Server, tous ont exactement le même comportement que Postgres. Pas de valeurs null sont autorisées dans les colonnes de la partie de la clé primaire.
  • Il doit y avoir un malentendu. Comme @ypercube a commenté: Oracle ne pas autoriser les valeurs NULL dans un PK colonne: sqlfiddle.com/#!4/52cf2/1. Ni MySQL: sqlfiddle.com/#!2/ce8d4e.
  • Il n'est pas étrange comportement. Une collection de colonnes que l'on peut inclure les valeurs NULL ne sont pas, par définition, une clé candidate. Cela a été le cadre du modèle relationnel depuis 1970. Si elle ne peut pas être un candidat à la clé, alors il ne peut pas être la clé primaire. Il serait étrange si Postgres n'a pas l'appliquer.

InformationsquelleAutor user3422637 | 2014-10-30