Question

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

Utilisation de EMS SQL Manager for PostgreSQL.

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

J'ai pu travailler autour d'elle en laissant tomber 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;
Était-ce utile?

La solution

D'après le manuel correct (qui est fourni par PostgreSQL, pas par Oracle), il est disponible aucune contrainte modifier dans l'instruction ALTER TABLE:

Voici le lien vers le manuel correct:

http://www.postgresql.org/docs/current/ statique / SQL-altertable.html

Autres conseils

Il n'y a pas de commande ALTER des contraintes dans Postgres. La meilleure façon de la contrainte et rajoutez y parvenir est de baisse avec les paramètres souhaités. Bien sûr, tout changement de la contrainte sera exécutée sur les données de table en cours.

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

de la version 9.4, PostgreSQL ALTER TABLE ... ALTER CONSTRAINT pour les clés étrangères.

Cette fonctionnalité sera "Allow constraint attributes to be altered, so the default setting of NOT DEFERRABLE can be altered to DEFERRABLE and back." regardant votre question, je pense que c'est (un peu) ce que vous avez cherché.

informations et un exemple plus détaillé se trouve ici:
http: //www.depesz.com/2013/06/30/waiting-for-9-4-alter-table-alter-constraint-for-fks/

ALTER CONTRAINTE, il faudrait savoir de clé étrangère, ce qui est pas toujours pratique.

Voici fonction, vous devez savoir que les noms de tables et de colonnes. Utilisation:

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;

Soyez au courant: cette fonction ne copie pas les attributs de clé étrangère initiale. Il ne prend le nom nom / colonne table étrangère, écussons actuelle et remplace nouveau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top