106 votes

Essayer de modifier une contrainte dans PostgreSQL

J'ai vérifié la documentation fournie par Oracle et trouvé un moyen de modifier une contrainte sans laisser tomber la table. Le problème est qu'il se trompe lors de la modification car il ne reconnaît pas le mot-clé.

Utilisation d'EMS SQL Manager pour PostgreSQL.

 Alter table public.public_insurer_credit MODIFY CONSTRAINT public_insurer_credit_fk1
    deferrable, initially deferred;

J'ai pu contourner cela en supprimant la contrainte en utilisant :

 ALTER TABLE "public"."public_insurer_credit"
  DROP CONSTRAINT "public_insurer_credit_fk1" RESTRICT;

ALTER TABLE "public"."public_insurer_credit"
  ADD CONSTRAINT "public_insurer_credit_fk1" FOREIGN KEY ("branch_id", "order_id", "public_insurer_id")
    REFERENCES "public"."order_public_insurer"("branch_id", "order_id", "public_insurer_id")
    ON UPDATE CASCADE
    ON DELETE NO ACTION
    DEFERRABLE 
    INITIALLY DEFERRED;

181voto

Chris Cashwell Points 9264

Il n'y a pas de commande ALTER pour les contraintes dans Postgres. Le moyen le plus simple d'y parvenir est de supprimer la contrainte et de la rajouter avec les paramètres souhaités. Bien entendu, toute modification de la contrainte sera exécutée sur les données de la table actuelle.

 BEGIN;
ALTER TABLE t1 DROP CONSTRAINT ...
ALTER TABLE t1 ADD CONSTRAINT ...
COMMIT;

50voto

mkurz Points 1972

Depuis la version 9.4, PostgreSQL prend en charge ALTER TABLE ... ALTER CONSTRAINT pour les clés étrangères.

Ces fonctionnalités seront "Allow constraint attributes to be altered, so the default setting of NOT DEFERRABLE can be altered to DEFERRABLE and back." En regardant votre question, je pense que c'est (en quelque sorte) ce que vous recherchiez.

Des informations plus détaillées et un exemple peuvent être trouvés ici : http://www.depesz.com/2013/06/30/waiting-for-9-4-alter-table-alter-constraint-for-fks/

47voto

a_horse_with_no_name Points 100769

Selon le manuel correct (qui est fourni par PostgreSQL, pas par Oracle), il n'y a pas de contrainte de modification disponible dans l'instruction ALTER TABLE :

Voici le lien vers le bon manuel :

http://www.postgresql.org/docs/current/static/sql-altertable.html

8voto

Dan Key Points 2255

ALTER CONSTRAINT nécessiterait de connaître le nom de la clé étrangère, ce qui n'est pas toujours pratique.

Voici la fonction, où vous devez connaître uniquement les noms de table et de colonne. Usage:

 select replace_foreign_key('user_rates_posts', 'post_id', 'ON DELETE CASCADE');

Fonction:

 CREATE OR REPLACE FUNCTION 
    replace_foreign_key(f_table VARCHAR, f_column VARCHAR, new_options VARCHAR) 
RETURNS VARCHAR
AS $$
DECLARE constraint_name varchar;
DECLARE reftable varchar;
DECLARE refcolumn varchar;
BEGIN

SELECT tc.constraint_name, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY' 
   AND tc.table_name= f_table AND kcu.column_name= f_column
INTO constraint_name, reftable, refcolumn;

EXECUTE 'alter table ' || f_table || ' drop constraint ' || constraint_name || 
', ADD CONSTRAINT ' || constraint_name || ' FOREIGN KEY (' || f_column || ') ' ||
' REFERENCES ' || reftable || '(' || refcolumn || ') ' || new_options || ';';

RETURN 'Constraint replaced: ' || constraint_name || ' (' || f_table || '.' || f_column ||
 ' -> ' || reftable || '.' || refcolumn || '); New options: ' || new_options;

END;
$$ LANGUAGE plpgsql;

Attention : cette fonction ne copiera pas les attributs de la clé étrangère initiale. Il ne prend que le nom de la table étrangère / nom de la colonne, supprime la clé actuelle et la remplace par une nouvelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X