2010-03-11 46 views
5

我试图在MySQL数据库中建立一对一的关系。我使用InnoDB引擎和基础表看起来像这样: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`) 
) 

现在,一旦我已经设置了这些我改变foo表,以便fooID也成为在酒吧外键fooID。 我面临的唯一问题是,当我尝试插入任何一个时,会出现一个完整性问题。 我想要一些帮助,谢谢。

回答

4

关系数据库中的真正的一对一关系最好通过添加一列来完成;如果每个记录总是需要这两个表中的数据,那么该表应该定义为foo(fooID,name,barname)。

+0

@ chris-shaffer不幸的是它必须是两个单独的表格。会不会有某种交易方式? 谢谢 – Botto 2010-03-11 23:23:18

+0

@Botto:正如我写在另一个答案 - 在其他数据库中可以推迟约束。然而'轻'MySQL在文档中没有提及它。 – 2010-03-12 00:13:36

+1

如果它必须是两个表,请选择哪个表代表实际实体,然后编写代码以处理其他表中的记录不存在的情况。我认为这是你能够做到的最好的。 – 2010-03-12 01:07:51

1

您可以将约束检查交易结束。但是我没有找到任何MySQL(它不是最高级的数据库)。对于PostgreSQL(对于其他语法变化):

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

这意味着约束将在事务结束时被检查。

如果您必须使用MySQL,请使用Chris Shaffer的答案。

0

我发现了一个“哈克”解决了这个,可变FOREIGN_KEY_CHECKS都可以使用。

如果一个改变foo中有在酒吧外键约束的fooID,一个可以然后插入这样

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

正如我所说的“哈克”我可能不会来此上一个生产系统。