¿Como cambio las restricciones de intregridad referencial una vez creadas las tablas?

publicado por: Anonymous

Tengo una tabla llamada usuario. El código que use para crearla es el siguiente:

CREATE TABLE IF NOT EXISTS `cumplimiento`.`usuario` (
  `idusuario` VARCHAR(10) NOT NULL,
  `pass` VARCHAR(100) NOT NULL,
  `rol` INT NOT NULL,
  `activo` TINYINT(1) NOT NULL,
  `pregunta` VARCHAR(55) NULL,
  `respuesta` VARCHAR(200) NULL,
  PRIMARY KEY (`idusuario`),
  INDEX `fk_usuario_rol1_idx` (`rol` ASC),
  CONSTRAINT `fk_usuario_rol1`
    FOREIGN KEY (`rol`)
    REFERENCES `cumplimiento`.`rol` (`rol`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

La tabla se crea correctamente y todo esta bien. La situación es la siguiente. Yo necesito hacer un UPDATE a idusuario y que ese cambio se refleje en las tablas en donde este campo es una llave foránea.

Encontre que la forma de hacer eso es utilizar la instrucción:

ON UPDATE CASCADE

Por ejemplo, tengo esta otra tabla persona, cuyo código es el siguiente:

CREATE TABLE IF NOT EXISTS `cumplimiento`.`persona` (
  `cif` INT NOT NULL,
  `idusuario` VARCHAR(10) NOT NULL,
  `numero_impresiones` INT NULL,
  INDEX `fk_persona_usuario1_idx` (`idusuario` ASC),
  PRIMARY KEY (`cif`),
  CONSTRAINT `fk_persona_usuario1`
    FOREIGN KEY (`idusuario`)
    REFERENCES `cumplimiento`.`usuario` (`idusuario`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Y entiendo que bajo las REFERENCES esta mi campo idusuario. Tambien entiendo que es en esta tabla que tengo que cambiar el ON UPDATE NO ACTION a ON UPDATE CASCADE, y asi sucesivamente en otras tablas donde tenga este campo como llave foránea.

Ahora bien, básicamente no lo he hecho porque tengo un poco de temor de que algo pueda pasar a mis tablas e intuyo que hay una forma facil de hacerlo. ¿Como hago para cambiar eso? ¿Tengo que usar el mismo script y solo cambiar esa parte de cada tabla? o quizas, ¿se puede hacer de alguna forma en Workbench?

solución

Me parece que no hay forma de actualizar un constraint, lo que tienes que hacer son dos cosas:

  1. Eliminar el constraint actual
  2. Agregar un nuevo constraint

Por lo tanto, tendrías que hacer:

-- Eliminar el constraint
ALTER TABLE `cumplimiento`.`usuario`
DROP FOREIGN KEY `fk_usuario_rol1`;

-- Crearlo nuevamente
ALTER TABLE `cumplimiento`.`usuario`
ADD CONSTRAINT `fk_usuario_rol1` 
    FOREIGN KEY (`rol`)
    REFERENCES `cumplimiento`.`rol` (`rol`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE;

Puedes consultar la documentación con respecto al uso de FOREIGN KEY Constraints.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *