Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

No me funciona restricción

Estas en el tema de No me funciona restricción en el foro de Mysql en Foros del Web. Muguenas... He creado estas dos tablas: $query = "CREATE TABLE IF NOT EXISTS registrados ( registro_id INT UNSIGNED NOT NULL AUTO_INCREMENT, ... .. ... CONSTRAINT ...
  #1 (permalink)  
Antiguo 19/05/2011, 07:55
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 11 meses
Puntos: 0
No me funciona restricción

Muguenas...

He creado estas dos tablas:

$query = "CREATE TABLE IF NOT EXISTS registrados (
registro_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
..
...
CONSTRAINT pk_registro PRIMARY KEY (registro_id)
) ENGINE=MyISAM;



$query= 'CREATE TABLE IF NOT EXISTS amigos (
amigofuente INT UNSIGNED,
amigodestino INT UNSIGNED,
..
..
..
CONSTRAINT fk_amigos FOREIGN KEY (amigofuente,amigodestino) REFERENCES registrados(registro_id,registro_id)
) ENGINE=MyISAM;

Como ven, la segunda tabla trato de entablar relaciones (amigofuente conoce a amigodestino) y son valores ID que deben coincidir con la tabla registrados en su valor registro_id.

El FOREIGN KEY hace que amigofuente y amigodestino coincidan siempre con algún valor del registro_id en la tabla registrados.

Aunque al crear las tablas no me han devuelto ningun error, dentro de myphpadmin escribo:
insert into amigos (amigofuente) values (100)

y me mete dentro de la tabla amigos un valor 100 que no existe en la columna registro_id de la tabla registrados, por lo tanto la restricción no funciona.

¿que hago mal?

Muchas gracias por su tiempo y disculpad a este novato.
  #2 (permalink)  
Antiguo 19/05/2011, 08:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: No me funciona restricción

En las tablas MyISAM no existen las FOREIGN KEY. Sólo en tablas InnoDB.
La definición de la FK cuando creas una tabla MyISAM simplemente es ingnorada, es decir que no te devolverá un error, por cuestiones de compatibilidad del SQL, pero eso no significa que haya creado nada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/05/2011, 08:50
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: No me funciona restricción

Aahh!! ok!! muchas gracias!!!
¿cual es mas rápido MYISAM O INNODB?
  #4 (permalink)  
Antiguo 19/05/2011, 09:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: No me funciona restricción

Eso es una pregunta un tanto abstracta.
¿Más rápido en qué contexto?
¿Con qué estructura base?
¿Con cuáles consultas?
¿En qué sistema operativo?
¿Con cuál hardware?
¿Con qué topología de red?
¿Con cuántos usuarios?
¿Con qué concurrencia...?

Con esto te quiero decir que la performance de la base no la vas a medir por el tipo de tablas, sino en base a un criterio múltiple, que puede ser afectado por muchas cosas, incluyendo, por ejemplo, en la selección de los tipos de columna para las tablas, y la performance de la aplicación que se conecta a la base, y eso no implica que una sea mejor que otra.
Una tabla InnoDB puede ser más rápida que una MyISAM, o viceversa, dependiendo de muchísimos factores. No es algo que se pueda medir por el tipo de tabla.
Existen diferencias en la performance básica de ambas, pero los pro y los contra se terminan equilibrando desde cierta óptica.
Lo importante es lo que tu necesitas. Lo otro es desarrollo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 19/05/2011, 11:39
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: No me funciona restricción

Gracias por la respuesta, creo que mi pregunta irrita porque supongo que el tema se ha comentado mucho por aqui. La idea es la de hacer una web que se parezca a un foro y evidentemente las tablas se basarán en usuarios registrados, mensajes basados en ids de esos usuarios registrados, y está claro que se va a leer las tablas más que insertar y desde luego no habrá muchas subtablas asociadas, entonces creo que la opción MylSAM es la más conveniente. ¿me equivoco?
  #6 (permalink)  
Antiguo 19/05/2011, 12:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: No me funciona restricción

Tu pregunta no irrita, simplemente te quería aclarar que no era una pregunta fácil de responder porque las variables a considerar eran muchas.
En tu caso la conveniencia de tablas InnoDB o MyISAM dependerá de algunos factores, donde la cantidad de inserciones es clave.
Una base con muchas altas pero pocas bajas, o donde la carga de datos sea masiva, y especialmente en web, puede sacar provecho de las tablas MyISAM. Por eso los sitios web las usan mucho. Pero si tienes procesos donde afectes a varias tablas al mismo tiempo, y ese proceso debe funcionar como un todo integrado, consistente, las MyISAM no sirven porque sólo el motor InnoDB tiene transacciones, que son las que pueden controlar ese nivel de consistencia.
Algunos detalles importantes:
- MySQL no exige que todas las tablas de una base sean del mismo tipo, por lo que pueden coexistir tablas InnoDB con MyISAM. Lo que si requiere es que todo caso de FK sea entre tablas InnoDB. No las puedes mezclar.
- Si usas tablas MyISAM, y quieres mantener la relación, deberás conservar las relaciones y la consistencia de datos por medio de programación, esto es, deberás hacer que los procesos de tu aplicación sean ordenados, consistentes y trazables.
- Si usas tablas InnoDB debes tener en cuenta que el orden de ingreso de los datos a las tablas relacionadas es importante. No puedes poner un dato en una tabla con FK que no exista en su tabla referida. MySQL no dejará que lo hagas. Carga los datos en forma ordenada.
- Las búsquedas genéricas del tipo LIKE funcionan con cualquiera de las dos. Las de MATCH() ... AGAINST sólo con ídices FULLTEXT y estos sólo se pueden usar en MyISAM.
- Si usas transacciones, trata de hacerlo dentro de un sólo script. Si la conexión se cae, todo el proceso se descarta porque la desconexión sin COMMIT previo genera un ROLLBACK implícito.

...hay más cosas, pero por ahora es suficiente, creo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
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 17:31.