Relação tabelas MySQL: delete e update, cascata ou restrição?

  • Autor Autor hastati
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
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.
 
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
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 edição:
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 edição:
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:
Inserir CODE, HTML ou 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.
 
Voltar
Topo