Foros del Web » Programando para Internet » PHP »

Categorias y llaves Foraneas

Estas en el tema de Categorias y llaves Foraneas en el foro de PHP en Foros del Web. Hola, les escribo para que me saquen algunas dudas al respecto. Estoy creando un sistema de noticias con categorías (PADRES E HIJAS solamente.). Se me ...
  #1 (permalink)  
Antiguo 02/10/2009, 05:03
 
Fecha de Ingreso: mayo-2006
Mensajes: 119
Antigüedad: 18 años, 5 meses
Puntos: 0
Exclamación Categorias y llaves Foraneas

Hola, les escribo para que me saquen algunas dudas al respecto.

Estoy creando un sistema de noticias con categorías (PADRES E HIJAS solamente.).
Se me presenta un problema al momento de trabajar con la categorías, es decir, crear categorías (checkear que no existe previamente) y eliminarlas (eliminar categorías hijas)

Utilizo la siguiente tabla:
Código:
CREATE TABLE categorias(

id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
padre int(11),
categoria varchar(30) default NULL,

CONSTRAINT `fk_categorias` FOREIGN key (padre) REFERENCES categorias(id) on DELETE CASCADE)
ENGINE=InnoDB DEFAULT CHARSET=latin1;
Al momento de ingresar una categoría padre, utilizo:

INSERT INTO categorias VALUES('',0,'cat1');

Pero la consola me devuelve:
Error Code : 1452
Cannot add or update a child row: a foreign key constraint fails (`ejemplos`.`categorias`, CONSTRAINT `fk_categorias` FOREIGN KEY (`padre`) REFERENCES `categorias` (`id`) ON DELETE CASCADE)
(0 ms taken)



Alguien me podría dar una idea mas clara de cómo seria el asunto?
Estoy enredado.


Muchas gracias.
  #2 (permalink)  
Antiguo 02/10/2009, 05:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Categorias y llaves Foraneas

aca en el segundo post tenés un ejemplo.
http://www.forosdelweb.com/f18/delet...xtrano-732265/

Lee los primeros post de la pregunta que tratan el tema.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 02/10/2009, 05:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Categorias y llaves Foraneas

Código sql:
Ver original
  1. INSERT INTO categorias VALUES('',0,'cat1');
En primer lugar, por una cuestión práctica, y a pesar de que te lleve un poco más de codificación, siempre es bueno especificar los campos que se van a ingresar cuando no vas a poner datos en uno de ellos, como es enl caso de los ID auto_increment.
Código sql:
Ver original
  1. INSERT INTO categorias(padre, categoria) VALUES(0,'cat1');
Ganas en eficiencia de código, ayudas al parser y evitas errores de interpretación en la lectura cuando tienes que revisar las sentencias...

Yendo a tu problema, tu sentencia de creación tiene un problema: le estás dejando al motor de MySQL que determine si el campo ´padre´puede ser NULL o NOT NULL, con lo cual si el NOT NULL es el default (y ese es el valor por default de una instalación de MySQL), te encuentras en un problema: Se vuelve circular.
Para poder cargar un registro deben existir IDS en la tabla sobre qué comparar el contenido de `padre`, pero no puedes poner un registro con un ID nuevo sin poner un valor que ya exista entre los ID en `padre`.
¿Se entiende la circularidad?
El tema aquí es que la relación debe establecerse preferentemente en otra tabla, porque si bien la relación es 1:N, la restricción de FK te impedirá poner registros, a menos que declares el campo como NULL. En ese caso podrás ingresar categorías sin padre, que serán los primeros niveles.

¿Se va entendiendo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 03/10/2009, 01:47
 
Fecha de Ingreso: mayo-2006
Mensajes: 119
Antigüedad: 18 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Categorias y llaves Foraneas

Hola gnzsoloyo , tu explicación me dejo mucho mas claro todo el asunto, evite lo del “circulo” que me comentabas asignando a "padre" como NULL en vez de 0

Sin embargo ahora no me funciona la función (valga la redundancia) que me muestra, jerárquicamente, todas las categorías de noticias.

Tabla categorías:


Función con el error.
Código PHP:
function crearArbol($tabla,$id_field,$show_data,$link_field,$parent,$prefix){
    
/*Armar query*/
    
$sql='select * from '.$tabla.' where '.$link_field.'='.$parent;
    
/*Asumiendo que se usa MySQL (se puede cambiar facilmente a otra db)*/
    
$rs=@mysql_query($sql);
    if(
$rs){
        
/*Recorrer todos las entradas */        
        
while($arr=mysql_fetch_assoc($rs)){
        
/* Imprimir campo a mostrar*/        
        
echo($prefix.$arr[$show_data].'<br>');        
        
/* imprimir arbol the "hijos" de este elemento*/
crearArbol($tabla,$id_field,$show_data,$link_field,$arr[$id_field],$prefix.$prefix);
        }
    }
}

//saco todas las categorias, ordenadas gerarquicamente
echo crearArbol('categorias','id','categoria','padre',0,'-'); 
Huesos52, exactamente ese post fue el que me sirvió para realizar parte de este proyecto.


Muchas gracias a ambos.
  #5 (permalink)  
Antiguo 05/10/2009, 06:52
 
Fecha de Ingreso: mayo-2006
Mensajes: 119
Antigüedad: 18 años, 5 meses
Puntos: 0
Respuesta: Categorias y llaves Foraneas

Tendrían que moverlo a la seccion PHP, este hilo , no?
  #6 (permalink)  
Antiguo 05/10/2009, 07:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Categorias y llaves Foraneas

Yep. El problema ya es de PHP, por cuanto la creación del árbol es asunto de PHP y no de la base.
De todos modos te comento: El principio aquí es que la raíz del árbol es aquel registro que tiene padre NULL, y a partir de ello debes establecer el punto de corte de la función. Es el mismo principio que se usa en los cursos de Oracle para un caso ejemplo con base de pruebas y entrenamiento de Oracle 10g, para determinar la estructura de empleados de un conjunto de departamentos, de modo que lo puedes considerar un estandar en este tipo de modelos.
Yo que tu, buscaría contruir una función recursiva que me diese este resultado partiendo de una tabla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 05/10/2009, 08:12
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Categorias y llaves Foraneas

Cita:
Al momento de ingresar una categoría padre, utilizo:

INSERT INTO categorias VALUES('',0,'cat1');

Pero la consola me devuelve:
Error Code : 1452
Cannot add or update a child row: a foreign key constraint fails (`ejemplos`.`categorias`, CONSTRAINT `fk_categorias` FOREIGN KEY (`padre`) REFERENCES `categorias` (`id`) ON DELETE CASCADE)
(0 ms taken)



Alguien me podría dar una idea mas clara de cómo seria el asunto?
Estoy enredado.
En el post que te puse, se explica como se evita dicho error y conceptualmente por que se genera.

El trabaja sobre una misma tabla como si trabajara en tablas diferentes.
Primero tendrías que borrar los registros que no tienen dependencia antes que los que tienen dependencia.
Con delete cascade, borra en cascada los que tienen dependencia y los que no.

La ta
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:51.