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

Llaves ajenas

Estas en el tema de Llaves ajenas en el foro de Mysql en Foros del Web. Tengo una duda que me correo, imaginemos la siguiente alineacion: Código: CREATE TABLE user( user_id INT PRIMARY KEY, name VARCHAR(20)); CREATE TABLA user_libros( id_libro INT ...
  #1 (permalink)  
Antiguo 28/05/2008, 14:46
 
Fecha de Ingreso: marzo-2008
Mensajes: 37
Antigüedad: 16 años, 1 mes
Puntos: 0
Llaves ajenas

Tengo una duda que me correo, imaginemos la siguiente alineacion:
Código:
CREATE TABLE user(
user_id INT 
PRIMARY KEY, name VARCHAR(20));

CREATE TABLA user_libros(
id_libro INT PRIMARY KEY, 
user_id INT NOT NULL,
 name_libro VARHAR(10),
 FOREIGN KEY (user_id) REFERENCES user(user_id));
Bien, creadas estas 2 tablas, si yo metiera un user_id inexistente en la tabla user_libros, me deberia de dar un error, no?

Ya que hace referencia a un user_id que no existe, pues bien, no me da error y quisiera saber por que.

Uso mysql 5

PD: (En linux por si importa)

Gracias de antemano
  #2 (permalink)  
Antiguo 28/05/2008, 15:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Llaves ajenas

CREATE TABLE user(
user_id INT
PRIMARY KEY, name VARCHAR(20));

CREATE TABLE user_libros(
id_libro INT PRIMARY KEY,
user_id INT NOT NULL,
name_libro VARCHAR(10),
FOREIGN KEY (user_id) REFERENCES user(user_id));

Esto funciona bien. De hecho, con esta estructura, si introduces un user_id en la tabla user_libros que no existe como user_id en la tabla user, te da error. No te dará error si existe ese número en la tabla user.
  #3 (permalink)  
Antiguo 28/05/2008, 22:22
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
De acuerdo Respuesta: Llaves ajenas

Hola Leber, cómo vas??

Pues mira a pesar de que jurena te pasa la manera de como hacerlo, esto tiene dos "opciones", por ser las mas comúnes, dependen del tipo de tabla que vayas a manejar:

1. MyIsam
2. Innodb

Si trabajas con myisam, podràs hacer lo que quieras(en sentido figurado), es decir, myisam te permite mas libertad de proceso, eliminar llaves pk sin importar que exista como fk en otra tabla. Es decir no te protege implicitamente la integridad de la información. Pero es mas rápida que innodb, 4,5 veces mas.

Si trabajas con innodb, te protegerá tu integridad referencial, tus datos, por que es una motor transaccional. Como tal, debe asegurarse que la info que contenga sea lo mas consistente y real posible. Este tipo de tabla no te permite eliminar pk si existe como fk en otra tabla.

Entonces de acuerdo a todo esto (me extendí un poco), depende del tipo de tabla que vayas a manejar protegerá o no la integridad de los datos, valdrà o no las fk. Tú verás, la velocidad de las tablas myisam ó la protección de datos de innodb.

Saludos Espero te sirva
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #4 (permalink)  
Antiguo 29/05/2008, 04:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Llaves ajenas

Carxl lleva razón. Yo pensé que ya te habías decidido por InnoDB, que creo que ahora es el motor por defecto, y además esta parte de la sintaxis empleada en el create

FOREIGN KEY (user_id) REFERENCES user(user_id));

fuerza, según creo, la creación de una tabla InnoDB, aunque de esto último no estoy seguro (si puedes crear una tabla MyIsam con esa sintaxis, entonces ocurrirá lo que dices que te está ocurriendo, como te ha dicho Carxl. Yo por ahora uso MyIsam, pero si quieres controlar las relaciones con sus referencias y evitar inconsistencias, mucha gente te recomendará InnoDB, que además ofrece muchas otras cosas. Échale un vistazo a la información sobre los motores. Pero si tienes las tablas con motor InnoDB, tu sintaxis es correcta, siempre que primero crearas la tabla user en el orden de creación.

Última edición por jurena; 29/05/2008 a las 15:26
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:10.