如何在mySql中管理一对一的关系?

时间:2010-02-16 05:32:17

标签: mysql

我有两个关于客户的表,第二个关于他们的账户是'Customer_Account_Information'。我们知道一个客户只能有一个帐户,所以我试图强制执行一对一关系,但我不知道mySql或mySqlyog中的过程/语法。 有没有人可以帮助我?

2 个答案:

答案 0 :(得分:5)

您应该使用 CustomerID 在表帐户上创建外键约束表 Customers

查看FOREIGN KEY Constraints

然后在表帐户

中将其设为唯一列

查看MySQL foreign keys - how to enforce one-to-one across tables?

您还可以将表格帐户 PRIDARY KEY 列中的 CustomerID 用作 PRIMARY KEY PRIMARY KEY >

答案 1 :(得分:3)

一个简单的实现


这不是一个完美的解决方案,但通过一些mysql和参照完整性的经验很容易理解。

客户需要FOREIGN KEY来引用customer_account_inforamtion。由于客户中的account_id是加入表的唯一方法,因此customer_account_information中没有客户可以拥有多条记录。

在下面的示例定义中,我添加了FOREIGN KEY CONSTRAINT,这会导致客户在删除其帐户信息时被删除。您可能想要也可能不想要/需要这个。

CREATE TABLE customer_account_information (
    id int(11) NOT NULL auto_increment,
    some_attribute varchar(20) NOT NULL,
    another_attribute varchar(30) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE customers (
    id int(11) NOT NULL auto_increment,
    account_id int(11) NOT NULL,
    firstname varchar(30) NOT NULL,
    surname varchar(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX account_id (account_id),
    CONSTRAINT account_id FOREIGN KEY (account_id) REFERENCES customer_account_information (id) ON DELETE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

customer中的account_id是引用customer_account_information中记录的外键

替代实施

重新审视两个表的设计可能是一个想法。如果每个客户真的只能拥有一个帐户,那么每个客户的所有属性都可以合并到一个表中。是的,这个业务规则可能会在未来发生变化,但最好将这项工作推迟到真正必要之前 - 不要过度设计解决方案。