Relación tablas MySQL: delete y update, cascada o restricción?

  • Autor Autor hastati
  • Fecha de inicio Fecha de inicio
hastati

hastati

Delta
bueno estoy haciendo un sistema php que utiliza mysql entonces en este sistema creare dos tablas una llamada articulos y la otra llamada categorias, mi duda de la relacion es como ponerla en delete y update, si los dos en cascada o diferentes. estuve buscando informacion pero no encontre algo que pudiera entender del todo bien.

tengo entendido que en cascada elimina lo que este relacionado de las dos tablas y restrict que es lo que hace?

espero puedan especificarme esto, saludos.
 
Hola.
delte on cascade, eliminara todo lo que este asociado desde la tabla padre.
Restrict seria, NO te dejara eliminar , si hay registros asociados a la tabla a eliminar.
 
Hola.
delte on cascade, eliminara todo lo que este asociado desde la tabla padre.
Restrict seria, NO te dejara eliminar , si hay registros asociados a la tabla a eliminar.

osea que si hago que la tabla padre sea la categoria, al eliminar el articulo tambien se eliminaria la categoria?, entonces como tendria que ser la relacion para que al eliminar una categoria se eliminen los post, pero al eliminar un post no se eliminen las categorias?
 
osea que si hago que la tabla padre sea la categoria, al eliminar el articulo tambien se eliminaria la categoria?, entonces como tendria que ser la relacion para que al eliminar una categoria se eliminen los post, pero al eliminar un post no se eliminen las categorias?

Creo que seria algo asi, para cumplir las dos ultimas consultas. Si no leo mal
Deberias tener una table padre tipo <publicacion> y con dos tablas con dependecia hacia ella, <categoria> y <post>

ejemplo:
Publicacion(
id
categoria
post
fecha
autor
tipo (publica, privada, etc)
estado(publicada, borrador, enrevision) ;
 
Última edición:
No, se elimina todo de la tabla hijo que este relacionado con el registro eliminado de la tabla padre. Si la tabla padre es categorias, se eliminan todos los posts que tengan esa categoría.

osea que si hago que la tabla padre sea la categoria, al eliminar el articulo tambien se eliminaria la categoria?, entonces como tendria que ser la relacion para que al eliminar una categoria se eliminen los post, pero al eliminar un post no se eliminen las categorias?

Algo como esto:
PHP:
CREATE TABLE `categories` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `posts` (
  `id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `posts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `category_id` (`category_id`);

ALTER TABLE `categories`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE `posts`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE `posts`
  ADD CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Saludos.
 
Última edición:
No, se elimina todo de la tabla hijo que este relacionado con el registro eliminado de la tabla padre. Si la tabla padre es categorias, se eliminan todos los posts que tengan esa categoría.



Algo como esto:
PHP:
CREATE TABLE `categories` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `posts` (
  `id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `posts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `category_id` (`category_id`);

ALTER TABLE `categories`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE `posts`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE `posts`
  ADD CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Saludos.

muchas gracias bro, era lo que estaba buscando, saludos.
 
Cuando quieres que ocurran eventos asociados a consultas aparece el concepto de triggers.
Imaginate que tienes una tabla clientes, y quieres que cuando se produzca un insert se actualice "el número de clientes", es decir, se incremente y que cuando se produzca una operación delete, se decremente.

Esta sintaxis es para Oracle:
Insertar CODE, HTML o PHP:
create or replace TRIGGER "ACTUALIZADOR_CLIENTES" AFTER DELETE OR INSERT ON CLIENTES 
FOR EACH ROW 
BEGIN
  if inserting then
    update totales set ntclientes=ntclientes+1;
  elsif deleting then
    update totales set ntclientes=ntclientes-1;
  end if;
END;

each row significaria basicamente que el evento no se produce por cada instrucción de insertado, si no que se le aplica a cada fila a la que se le aplicó la instrucción de insertado/borrado.

after significaria que el evento se producirá justo despues de producirse la operación de añadido/borrado.
 
Atrás
Arriba