2010-03-11 21 views
5

Estoy tratando de hacer una relación uno a uno en una base de datos MySQL. Estoy utilizando el motor InnoDB y la tabla básica se parece a esto:relación uno a uno en MySQL

CREATE TABLE `foo` (
    `fooID` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `name` TEXT NOT NULL 
) 

CREATE TABLE `bar` (
    `barName` VARCHAR(100) NOT NULL, 
    `fooID` INT(11) NOT NULL PRIMARY KEY, 
    CONSTRAINT `contact` FOREIGN KEY (`fooID`) REFERENCES `foo`(`fooID`) 
) 

Ahora, una vez que he establecido que éstos alteran la tabla foo para que el fooID también se convierte en una clave externa a la fooID en la barra. El único problema al que me enfrento con esto es que habrá un problema de integridad cuando intente insertarlo. Me gustaría un poco de ayuda, gracias.

Respuesta

4

Una relación real uno-a-uno en una base de datos relacional se realiza mejor mediante la adición de una columna; Si los datos en estas dos tablas siempre son necesarios para cada registro, entonces la tabla debe definirse como foo (fooID, nombre, nombre de barra).

+0

@ chris-shaffer Desafortunadamente tiene que haber dos tablas separadas. ¿No habría alguna manera de hacerlo a través de las transacciones? Gracias – Botto

+0

@Botto: Como escribí en otra respuesta, en otras bases de datos es posible diferir las restricciones. Sin embargo, MySQL "ligero" no lo menciona en la documentación. –

+1

Si tiene que ser dos tablas, elija qué tabla representa la entidad real, luego escriba su código para manejar el caso donde no exista un registro en la otra tabla. Creo que es lo mejor que podrás hacer. –

1

Puede diferir la comprobación de la restricción hasta el final de la transacción. Sin embargo, no he encontrado nada para MySQL (no es la base de datos más avanzada). Para PostgreSQL (por otra la sintaxis varía):

ALTER TABLE foo ADD FOREIGN KEY (fooID) REFERENCES bar DEFERRABLE; 

Lo que significa que la restricción se comprueba al final de la transacción.

Si tiene que usar MySQL, use la respuesta de Chris Shaffer.

0

I conocer un "hacky" solución a este, la variable FOREIGN_KEY_CHECKS se pueden utilizar.

Si se altera el fooID en foo a tener una restricción de clave externa de la barra, se puede entonces insertar que como tal

SET foreign_key_checks = 0; 
INSERT...; 
INSERT...; 
SET foreign_key_checks = 1; 

Como ya he dicho "hacky" y que probablemente no a este en un sistema de producción.

Cuestiones relacionadas