sql - update - Cómo agregar ''ON DELETE CASCADE'' en la instrucción ALTER TABLE
update delete cascade sql (7)
Para cualquiera que use MySQL:
Si se dirige a su página web de PHPMYADMIN
y navega hasta la tabla que tiene la clave externa que desea actualizar, todo lo que tiene que hacer es hacer clic en la Relational view
ubicada en la pestaña Structure
y cambiar la opción de menú On delete
seleccionada a Cascade
.
Imagen que se muestra a continuación:
Tengo una restricción de clave externa en mi tabla, quiero agregar ON DELETE CASCADE a ella.
He intentado esto:
alter table child_table_name modify constraint fk_name foreign key (child_column_name) references parent_table_name (parent_column_name) on delete cascade;
No funciona
EDITAR:
La clave externa ya existe, hay datos en la columna de clave externa.
El mensaje de error que recibo después de ejecutar la declaración:
ORA-02275: such a referential constraint already exists in the table
¡Aquí hay una solución práctica! Estoy usando SQL Server 2008 R2.
Como quiera modificar la restricción FK agregando ON DELETE / UPDATE CASCADE, siga estos pasos:
NUMERO 1:
Haga clic derecho sobre la restricción y haga clic para modificar
NÚMERO 2:
Elija su restricción en el lado izquierdo (si hay más de uno). A continuación, en el lado derecho, contraiga el punto " INSERTAR Y ACTUALIZAR especificación " y especifique las acciones en Eliminar regla o Actualizar regla según lo necesite. Después de eso, cierre el cuadro de diálogo.
NUMERO 3:
El último paso es guardar estas modificaciones (¡por supuesto!)
PD: Me ha ahorrado un montón de trabajo ya que quiero modificar una clave principal a la que se hace referencia en otra tabla.
Como se explicó anteriormente:
ALTER TABLE TABLEName
drop CONSTRAINT FK_CONSTRAINTNAME;
ALTER TABLE TABLENAME
ADD CONSTRAINT FK_CONSTRAINTNAME
FOREIGN KEY (FId)
REFERENCES OTHERTABLE
(Id)
ON DELETE CASCADE ON UPDATE NO ACTION;
Como puede ver, tienen que ser comandos separados, primero soltando y luego agregando.
Este PL * SQL escribirá en DBMS_OUTPUT una secuencia de comandos que eliminará cada restricción que no tenga eliminar cascada y la recreará con la cascada de eliminación.
NOTA: ejecutar el resultado de este script es BAJO SU PROPIO RIESGO. Lo mejor es leer el guión resultante y editarlo antes de ejecutarlo.
DECLARE
CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS
select * from user_cons_columns
where constraint_name = theCons and owner = theOwner
order by position;
firstCol BOOLEAN := TRUE;
begin
-- For each constraint
FOR cons IN (select * from user_constraints
where delete_rule = ''NO ACTION''
and constraint_name not like ''%MODIFIED_BY_FK'' -- these constraints we do not want delete cascade
and constraint_name not like ''%CREATED_BY_FK''
order by table_name)
LOOP
-- Drop the constraint
DBMS_OUTPUT.PUT_LINE(''ALTER TABLE '' || cons.OWNER || ''.'' || cons.TABLE_NAME || '' DROP CONSTRAINT '' || cons.CONSTRAINT_NAME || '';'');
-- Re-create the constraint
DBMS_OUTPUT.PUT(''ALTER TABLE '' || cons.OWNER || ''.'' || cons.TABLE_NAME || '' ADD CONSTRAINT '' || cons.CONSTRAINT_NAME
|| '' FOREIGN KEY ('');
firstCol := TRUE;
-- For each referencing column
FOR consCol IN consCols(cons.CONSTRAINT_NAME, cons.OWNER)
LOOP
IF(firstCol) THEN
firstCol := FALSE;
ELSE
DBMS_OUTPUT.PUT('','');
END IF;
DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
END LOOP;
DBMS_OUTPUT.PUT('') REFERENCES '');
firstCol := TRUE;
-- For each referenced column
FOR consCol IN consCols(cons.R_CONSTRAINT_NAME, cons.R_OWNER)
LOOP
IF(firstCol) THEN
DBMS_OUTPUT.PUT(consCol.OWNER);
DBMS_OUTPUT.PUT(''.'');
DBMS_OUTPUT.PUT(consCol.TABLE_NAME); -- This seems a bit of a kluge.
DBMS_OUTPUT.PUT('' ('');
firstCol := FALSE;
ELSE
DBMS_OUTPUT.PUT('','');
END IF;
DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE('') ON DELETE CASCADE ENABLE VALIDATE;'');
END LOOP;
end;
Primero drop
su clave externa y pruebe el comando anterior, ponga la add constraint
lugar de modify constraint
. Ahora este es el comando:
ALTER TABLE child_table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (child_column_name)
REFERENCES parent_table_name(parent_column_name)
ON DELETE CASCADE;
Si desea cambiar una clave externa sin soltarla, puede hacer lo siguiente:
ALTER TABLE child_table_name WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE
No puede agregar ON DELETE CASCADE
a una restricción ya existente. Deberá drop
y volver a create
la restricción. La documentation muestra que la cláusula MODIFY CONSTRAINT
solo puede modificar el estado de una restricción (es decir: ENABLED/DISABLED
...).