PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Clé primaire et not null

Technique - général | Clé primaire et not null

Par sbouchard le 27/08/2007 - 15:12

Bonjour,

J'utilise Postgresql 8.2.3 sur Windows Server 2003

Lors de la création d'une contrainte de clé primaire (PK) , une contrainte NOT NULL est automatiquement créée et nommée par le noyau. Tout à fait normal.

Lors de la suppression de la contraint PK, la contrainte NOT NULL créée par le noyau n'est pas suprimée automatiquement. De ce fait, l'insertion de tuples sans valeur pour cette colonne n'est pas autorisée.

Comment est-ce possible?

La vue information_schema.table_constraints permet de visualiser le nom de cette contrainte. Toutefois, sa suppression manuelle par ALTER TABLE n'est pas possible. De toute manière, cela n'aurait pas beaucoup de sens de devoir supprimer manuellement les contraintes créées par le noyau.

QUelqu'un a-t-il une solution élégante? Une mise à jour doit-elle être installée?

Merci de vos conseils

Sylvie

Exemple :

CREATE TABLE test2 (
c1 INTEGER , c2 CHAR,
CONSTRAINT PK_test2 PRIMARY KEY (c1)
); -- OK

INSERT INTO test2 (c1, c2) VALUES (1, 'a'); -- OK

INSERT INTO test2 (c2) VALUES ('b'); -- Erreur attendue
--ERROR: null value in column "c1" violates not-null constraint

ALTER TABLE test2 DROP CONSTRAINT test2_pkey; -- OK

INSERT INTO test2 (c2) VALUES ('b'); -- OUPS!

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

canada=> \d test2

Column | Type | Modifiers
--------+--------------+-----------
c1 | integer | not null
c2 | character(1) |

SELECT constraint_name, constraint_type
FROM information_schema.table_constraints
WHERE table_name = 'test2';

constraint_name | constraint_type
------------------------+-----------------
16690_76762_1_not_null | CHECK

ALTER TABLE test2 DROP CONSTRAINT 16690_76762_1_not_null;

ERROR: syntax error at or near "16690"
LINE 1: ALTER TABLE test2 DROP CONSTRAINT 16690_76762_1_not_null;
^

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Bonjour Avez vous essayez

Christophe Chauvet/ = 28 Août, 2007 - 09:30

Bonjour

Avez vous essayez un

ALTER TABLE test2 ALTER COLUMN c1 DROP NOT NULL;

Cordialement.

Christophe Chauvet
KrysKool.org


PK et NOT NULL

sbouchard/ = 28 Août, 2007 - 14:38

Bonjour,

Effectivement, cette commande fonctionne. Merci pour la solution!

Toutefois, ne trouvez-vous pas qu'il y a un manque de cohérence de la part du noyau lors de la suppression d'une contrainte PK?

Cela n'est pas habituel et plutôt surprenant de devoir supprimer "à la main" une contrainte mise par le noyau.

Salutations,
Sylvie Bouchard


Lors de la suppression de la

Christophe Chauvet/ = 28 Août, 2007 - 15:26

Lors de la suppression de la contrainte, il aurait fallu ajouter le mot CASCADE pour effacer tous les objets dépendants de cette contrainte.

C'est le fonctionnement normal et non pas une incohérence.

Cordialement.

Christophe Chauvet
KrysKool.org


DROP PK CASCADE

sbouchard/ = 3 Septembre, 2007 - 11:21

Bonjour,

Cette dernière solution ne fonctionne pas. Je pense que la suppression en cascade de contraintes dépendantes est effective uniquement pour les contraintes déclarées par le développeur.
Cette option ne semble pas concerner les contraintes mises pas le noyau.
Je continue de penser qu'il y a un "bug" lors de la suppression d'une contrainte PRIMARY KEY. Le noyau devrait supprimer le NOT NULL lié.
Merci pour vos informations.
Sylvie


Bonjour Sylvie, Je ne suis

LoneEagle70/ = 6 Septembre, 2007 - 22:22

Bonjour Sylvie,

Je ne suis pas d'accords avec toi car les deux ne sont pas mutuellement exclusif. La seul différence est qu'une clé primaire doit avoir absolument la colonne NOT NULL. Si tu veux changer de NOT NULL à NULL, tu dois utiliser la commande ALTER COLUMN, comme pour n'importe laquelle colonne.

En tout cas, c'est mon avis qu'il n'y a pas de lien entre les deux, mais seulement une contrainte. :)


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.