Essayer de modifier une contrainte dans PostgreSQL
j'ai vérifié la documentation fournie par Oracle et j'ai trouvé un moyen de modifier une contrainte sans laisser tomber la table. Le problème est, il se trompe à modifier car il ne reconnaît pas le mot clé.
utiliser EMS SQL Manager pour PostgreSQL.
Alter table public.public_insurer_credit MODIFY CONSTRAINT public_insurer_credit_fk1
deferrable, initially deferred;
j'ai pu contourner 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;
4 réponses
selon le manuel correct (qui est fourni par PostgreSQL, pas par Oracle), il n'y a pas de contrainte de modification disponible dans la déclaration ALTER TABLE:
Voici le lien vers le bon manuel:
http://www.postgresql.org/docs/current/static/sql-altertable.html
Il n'y a pas de ALTER
commande des contraintes dans Postgres. La façon la plus facile d'accomplir ceci est de goutte la contrainte et la rajouter avec les paramètres désirés. Bien sûr, toute modification de la contrainte sera effectuée par rapport aux données du tableau actuel.
BEGIN;
ALTER TABLE t1 DROP CONSTRAINT ...
ALTER TABLE t1 ADD CONSTRAINT ...
COMMIT;
cette fonctionnalité sera "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 cherchez.
des informations plus détaillées et un exemple peuvent être trouvés here:
http://www.depesz.com/2013/06/30/waiting-for-9-4-alter-table-alter-constraint-for-fks/
MODIFIER CONTRAINTE nécessitent de savoir de nom de clé étrangère, qui n'est pas toujours commode.
Voici la fonction, où vous devez savoir seulement les noms de table et de colonne. D'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;
attention: cette fonction ne pas copier attributs de la clé étrangère initiale. Il ne prend que le nom de la table étrangère / le nom de la colonne, laisse tomber la touche courante et remplace avec un nouveau.