una - llaves foraneas mysql workbench codigo
Claves foráneas en MySQL? (5)
Estoy de acuerdo con Robert. Falta el nombre de la columna en la cláusula de referencias (y debería recibir el error 150). Añadiré que puedes verificar cómo se crearon las tablas en realidad con:
SHOW CREATE TABLE posts;
Poco a poco fui aprendiendo SQL las últimas semanas. Recogí todo el álgebra relacional y los conceptos básicos de cómo funcionan las bases de datos relacionales. Lo que trato de hacer ahora es aprender cómo se implementa.
Un obstáculo que he encontrado en esto, son las claves externas en MySQL. Parece que no puedo encontrar mucho más que el hecho de que existen en el esquema de almacenamiento InnoDB que tiene MySQL.
¿Qué es un ejemplo simple de claves extranjeras implementadas en MySQL?
Aquí hay una parte de un esquema que escribí que no parece funcionar si prefieres señalar mi falla que mostrarme un ejemplo de trabajo.
CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment,
`content` text NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`uID` bigint(20) NOT NULL,
`wikiptr` bigint(20) default NULL,
`cID` bigint(20) NOT NULL,
PRIMARY KEY (`pID`),
Foreign Key(`cID`) references categories,
Foreign Key(`uID`) references users
) ENGINE=InnoDB;
Editado: Robert y Vinko afirman que debe declarar el nombre de la columna a la que se hace referencia en la restricción de clave externa. Esto es necesario en InnoDB, aunque en SQL estándar puede omitir el nombre de columna referenciado si tiene el mismo nombre en la tabla padre.
Una idiosincrasia que he encontrado en MySQL es que la declaración de clave externa fallará silenciosamente en varias circunstancias:
- Su instalación MySQL no incluye el motor innodb
- Su archivo de configuración de MySQL no habilita el motor innodb
- No declaras tu tabla con el modificador ENGINE = InnoDB table
- La columna de clave externa no es exactamente el mismo tipo de datos que la columna de clave principal en la tabla a la que se hace referencia
Desafortunadamente, MySQL no da ningún mensaje de que no ha podido crear la restricción de clave externa. Simplemente ignora la solicitud y crea la tabla sin la clave externa (si MUESTRA las publicaciones de CREATE TABLE, es posible que no vea ninguna declaración de clave externa). ¡Siempre pensé que esta es una mala característica de MySQL!
Consejo: el argumento entero para tipos de datos enteros (p. Ej., BIGINT (20)) no es necesario. No tiene nada que ver con el tamaño de almacenamiento o el rango de la columna. BIGINT siempre tiene el mismo tamaño independientemente del argumento que le des. El número se refiere a cuántos dígitos MySQL rellenará la columna si usa el modificador de columna ZEROFILL.
Las respuestas anteriores se refieren a la restricción de clave externa. Si bien la restricción de clave externa es definitivamente útil para mantener la integridad referencial, el concepto de "clave externa" en sí mismo es fundamental para el modelo relacional de datos, independientemente de si usted usa la restricción o no.
Cada vez que haces una equijoin , estás equiparando una clave externa con algo, generalmente la clave a la que hace referencia. Ejemplo:
select *
from
Students
inner join
StudentCourses
on Students.StudentId = StudentCourses.StudentId
StudentCourses.StudentId es una clave externa que hace referencia a Students.StudentId.
Suponiendo que su tabla de categorías y usuarios ya exista y contenga cID y uID respectivamente como claves principales, esto debería funcionar:
CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment,
`content` text NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`uID` bigint(20) NOT NULL,
`wikiptr` bigint(20) default NULL,
`cID` bigint(20) NOT NULL,
PRIMARY KEY (`pID`),
Foreign Key(`cID`) references categories(`cID`),
Foreign Key(`uID`) references users(`uID`)
) ENGINE=InnoDB;
El nombre de la columna es obligatorio en la cláusula de references
.
Esto tiene algún código que muestra cómo crear claves externas por sí mismos, y en CREATE TABLE.
Aquí hay uno de los ejemplos más simples de eso:
CREATE TABLE parent (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;