一个表与两个一对一的关系SQL

时间:2013-11-16 20:07:45

标签: sql foreign-keys relationship one-to-one

在我的数据库中,我有帐户,经理和客户的表格。客户和经理都有帐户。 Customer-Account和Manager-Account之间存在两个一对一的关系。我在客户和经理表中都将AccountID作为FK。问题是,现在没有什么能阻止帐户同时与经理和客户联系在一起。我应该如何设计这种关系,或者我应该如何实现这一关系。

1 个答案:

答案 0 :(得分:0)

使用帐户类型标记每个帐户。此列可以只包含给定帐户的一个值。

CREATE TABLE Accounts (
 account_id INT PRIMARY KEY,
 account_type TINYINT NOT NULL,
 UNIQUE KEY (account_id, account_type)
);

然后,将每种类型的帐户限制为一种特定的帐户类型。

CREATE TABLE Managers (
 account_id INT PRIMARY KEY,
 account_type TINYINT NOT NULL DEFAULT 1,
 FOREIGN KEY (account_id, account_type) 
   REFERENCES Accounts(account_id, account_type)
);

CREATE TABLE Customers (
 account_id INT PRIMARY KEY,
 account_type TINYINT NOT NULL DEFAULT 2,
 FOREIGN KEY (account_id, account_type) 
   REFERENCES Accounts(account_id, account_type)
);

这确定了默认值,但它不会阻止错误的数据,例如在Managers中使用account_type 4创建一行。要建立该约束,可以使用触发器,CHECK约束或外键来实现只有一个值的小桌子。


重新评论:

这种方式的工作方式是首先在Account中插入一行,然后选择account_type:

INSERT INTO Accounts (account_id, account_type) VALUES (123, 1);

现在,此行只能由account_type = 1的行引用。

如果您只在account_type = 1的Managers中插入行,并且从不在具有该account_type的Customers中插入行,那么Accounts中的行只能由Manager引用。

-- First example: works fine
INSERT INTO Managers (account_id, account_type) VALUES (123, 1);

-- Second example: wrong account_type for the Customers table
INSERT INTO Customers (account_id, account_type) VALUES (123, 1);

-- Third example: foreign key error, because Account 123 does not have account_type=2
INSERT INTO Customers (account_id, account_type) VALUES (123, 2);
  

客户和经理有自己的主键

这没关系。我在我的示例中使用了account_id作为主键,但这是可选的。如果您有不同的主键列,它仍然有效。例如:

CREATE TABLE Managers (
 id INT AUTO_INCREMENT PRIMARY KEY,
 account_id INT NOT NULL,
 account_type TINYINT NOT NULL DEFAULT 1,
 FOREIGN KEY (account_id, account_type) 
   REFERENCES Accounts(account_id, account_type)
);