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;
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?
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¿¿?
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.
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¿¿¿?
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/innodb-foreign-key-constraints.html)
http://dev.mysql.com/doc/refman/5.0/es/constraint-primary-key.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.
estoy casi en las mismas nose que hacer
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.
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.
---
--- 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.