tutorial tablas restricciones primary español eliminar desde crear consultas constraint cero aprender sql postgresql alter

tablas - Intentando modificar una restricción en PostgreSQL



postgresql tutorial (4)

A partir de la versión 9.4, PostgreSQL admite ALTER TABLE ... ALTER CONSTRAINT para claves externas.

Estas características "Allow constraint attributes to be altered, so the default setting of NOT DEFERRABLE can be altered to DEFERRABLE and back." Al ver tu pregunta, creo que es (algo así) lo que has estado buscando.

Puede encontrar información más detallada y un ejemplo aquí:
http://www.depesz.com/2013/06/30/waiting-for-9-4-alter-table-alter-constraint-for-fks/

Revisé la documentación proporcionada por Oracle y encontré una forma de modificar una restricción sin soltar la tabla. El problema es que se equivoca al modificar ya que no reconoce la palabra clave.

Usando EMS SQL Manager para PostgreSQL.

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

Pude evitarlo eliminando la restricción usando:

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;


ALTER CONSTRAINT requeriría conocer el nombre de la clave externa, que no siempre es conveniente.

Aquí está la función, donde solo necesita conocer los nombres de tabla y columna. Uso:

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

Función:

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;

Tenga en cuenta que esta función no copiará los atributos de la clave externa inicial. Solo toma el nombre de la tabla / nombre de columna foránea, descarta la clave actual y la reemplaza por una nueva.



No hay ningún comando ALTER para las restricciones en Postgres. La forma más fácil de lograr esto es eliminar la restricción y volver a agregarla con los parámetros deseados. Por supuesto, cualquier cambio de la restricción se ejecutará contra los datos de la tabla actual.

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