varios foreign key me da problemas

Iniciado por tecasoft, 8 Noviembre 2012, 15:51 PM

0 Miembros y 1 Visitante están viendo este tema.

tecasoft

me da problemas error 150 y no marca lineas ni nada pero probando el error esta en que tengo 3 foreign keys si quito los 2 ultimo me van bien y no es lo que quiero. ayuda for favor


--
-- TABLA clientes
--

CREATE TABLE TEC_clientes(
cod_usu TINYINT,
nombre VARCHAR(25) NOT NULL,
apellidos VARCHAR(35) NOT NULL,
nif VARCHAR(10) NOT NULL,
nombre_empresa VARCHAR(20),
forma_juridica VARCHAR(20),
cif VARCHAR(15),
pais VARCHAR(25) NOT NULL,
provincia VARCHAR(20) NOT NULL,
localidad VARCHAR(20) NOT NULL,
codigo_postal NUMERIC(4) NOT NULL,
direccion VARCHAR(35) NOT NULL,
telefono VARCHAR(10) NOT NULL,
email VARCHAR(35) NOT NULL,
usuario VARCHAR(20) NOT NULL,
contrasena VARCHAR(60) NOT NULL,
CONSTRAINT PKUSU PRIMARY KEY (cod_usu),
CONSTRAINT usuunica2 UNIQUE(usuario)
) ENGINE=InnoDB;




---
--- TABLA servidores
---

CREATE TABLE TEC_servidores(
descripcion TINYINT,
email TINYINT NOT NULL,
telefono TINYINT NOT NULL,
cod_usu TINYINT NOT NULL,
CONSTRAINT PKDESCRIPCION PRIMARY KEY (descripcion),
CONSTRAINT FKUSUA FOREIGN KEY (cod_usu) REFERENCES TEC_clientes(cod_usu) ON DELETE CASCADE,
CONSTRAINT FKTELEFONO FOREIGN KEY (telefono) REFERENCES TEC_clientes(telefono) ON DELETE CASCADE,
CONSTRAINT FKEMAIL FOREIGN KEY (email) REFERENCES TEC_clientes(email) ON DELETE CASCADE
) ENGINE=InnoDB;
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

Shell Root

Forening Key Definición: En el contexto de bases de datos relacionales, una clave foránea o clave ajena (o Foreign Key FK) es una limitación referencial entre dos tablas. La clave foránea identifica una columna o grupo de columnas en una tabla (tabla hija o referendo) que se refiere a una columna o grupo de columnas en otra tabla (tabla maestra o referenciada). LAS COLUMNAS EN LA TABLA REFERENDO DEBEN SER LA CLAVE PRIMARIA...

Ahora dime en que fallas?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

tecasoft

yo lo que quiero es que el email de una tabla se guarde en la segunda tabla como tambien el telefono. si quito las dos ultimas foreign como te mencionado no salta error pero yo quiero que los datos email,telefono esten en la segunda tabla como te comento que hago¿¿?
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

Pablo Videla

Cita de: tecasoft en  9 Noviembre 2012, 16:45 PM
yo lo que quiero es que el email de una tabla se guarde en la segunda tabla como tambien el telefono. si quito las dos ultimas foreign como te mencionado no salta error pero yo quiero que los datos email,telefono esten en la segunda tabla como te comento que hago¿¿?
Tienes que insertar explicitamente los datos en todas las tablas que la requieran.

tecasoft

entonces tendria que hacer inserts para esa tabla como dices pero si se cambian datos de una tabla tendre que hacer un update de las 2 tablas no¿? es correcto esto¿¿? y lo estoy haciendo bien seguro¿¿¿?
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

HdM

Hola.

Écha un vistazo a estas dos referencias:

http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

http://dev.mysql.com/doc/refman/5.0/es/constraint-primary-key.html

Como bien ha indicado Shell Root, la FK debe apuntar a una PK, aunque no necesariamente (está claro que no es el mejor diseño de la db, o no se considera una buena práctica, pero como poderse hacer, se puede.)

Saludos.

- Nice to see you again -

tecasoft

estoy casi en las mismas nose que hacer
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

Shell Root

Plantea bien el problema, y te ayudaremos, no se para que duplicar registros en diferentes tablas, si puedes hacer una query para llegar al mismo dato.
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

HdM

Hola.

Cita de: tecasoft en  9 Noviembre 2012, 22:36 PM
estoy casi en las mismas nose que hacer

Con la doc enlazada lo que trataba de indicarte es que si los campos a los que apuntan las FK, los defines como UNIQUE, no deberías tener problemas (la integridad referencial evitaría datos incoherentes).

Pero como de nuevo ya te han indicado, para qué definir tantas FK, si en principio con una sola tienes suficiente.

Saludos.

- Nice to see you again -

Hadess_inf

Código (sql) [Seleccionar]
---
--- TABLA servidores
---

CREATE TABLE TEC_servidores(
descripcion TINYINT,
email TINYINT NOT NULL,
telefono TINYINT NOT NULL,
cod_usu TINYINT NOT NULL,
CONSTRAINT PKDESCRIPCION PRIMARY KEY (descripcion),
CONSTRAINT FK_TECSERVIDORES_TECCLIENTES FOREIGN KEY (cod_usu,telefono,email) REFERENCES TEC_clientes(cod_usu,telefono,email) ON DELETE CASCADE
) ENGINE=InnoDB;


Sin embargo esa practica no tiene mucho sentido puesto que ni telefono, ni email forman parte de la llave de la tabla cliente.

Deberías redefinir que es lo que deseas para que así puedas sacar un mejor performance a tus futuras querys.