2010-03-11 2 views
5

Sto cercando di creare una relazione uno a uno in un DB MySQL. Sto utilizzando il motore InnoDB e la tabella di base assomiglia a questo:Relazione One to One in 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`) 
) 

Ora, una volta ho installato questi ho modificare la tabella foo in modo che il fooID diventa anche una chiave esterna alla fooID in bar. L'unico problema che sto affrontando con questo è che ci sarà un problema di integrità quando cerco di inserire in entrambi. Vorrei un aiuto, grazie.

risposta

4

Una relazione one-to-one reale in un database relazionale viene eseguita al meglio aggiungendo una colonna; Se i dati in queste due tabelle sono sempre richiesti per ogni record, la tabella deve essere definita come foo (fooID, nome, nome della barra).

+0

@ chris-shaffer Deve essere purtroppo due tabelle separate. Non ci sarebbe un modo di fare attraverso le transazioni? Grazie – Botto

+0

@Botto: come ho scritto in un'altra risposta - in altri database è possibile rinviare i vincoli. Tuttavia MySQL 'leggero' non ne ha menzionato nella documentazione. –

+1

Se devono essere due tabelle, scegliere quale tabella rappresenta l'entità effettiva, quindi scrivere il codice per gestire il caso in cui non esiste un record nell'altra tabella. Penso che sia il meglio che sarai in grado di fare. –

1

È possibile impostare il controllo del vincolo alla fine della transazione. Tuttavia non ho trovato nulla per MySQL (non è il database più avanzato). Per PostgreSQL (per altro la sintassi varia):

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

Il che significa che vincolo sarà controllato al termine della transazione.

Se si utilizza MySQL, utilizzare la risposta di Chris Shaffer.

0

Ho trovato un "hacky" soluzione a questo, la variabile foreign_key_checks possono essere utilizzati.

Se si altera la fooID in foo per avere un vincolo di chiave esterna in bar, si può quindi inserire che in quanto tale

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

Come ho detto "hacky" e io probabilmente non sarebbe a questo su un sistema di produzione.