2013-11-16 3 views
1

В моей базе данных у меня есть таблицы для учетных записей, менеджеров и клиентов. У клиентов и менеджеров есть счета. Здесь существуют две взаимосвязи между учетной записью клиента и учетной записью менеджера. У меня есть учетная запись как FK в таблицах клиентов и менеджеров. Проблема в том, что теперь ничто не препятствует привязке учетной записи к менеджеру и клиенту одновременно. Как мне создать такое отношение или как я должен реализовывать эту вещь.Одна таблица с двумя отношениями один к одному SQL

ответ

0

Отметьте каждую учетную запись тип счета. Этот столбец может иметь ровно одно значение для данной учетной записи.

Затем сделайте каждый тип учетной записи привяжите себя к определенному типу учетной записи.

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) 
); 

Это устанавливает по умолчанию, но это не мешает неправильные данные, например, делая строку в Управляющих ACCOUNT_TYPE 4. Чтобы установить это ограничение, вы можете использовать триггер, или СНЕСК или внешний ключ к маленькому столу с одним значением.


Re ваш комментарий:

Как это работает в том, что сначала вставить строку в учетной записи, и вы выбираете ACCOUNT_TYPE:

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

Теперь эта строка может ссылаться только строка с account_type = 1.

Если вы вставляете строки только в Менеджеры с именем account_type = 1 и никогда не вставляете строки в Клиенты с этим типом account_type, то в строке в Accounts должен быть указан только менеджер.

-- 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) 
); 
+0

хорошо спасибо за ваш ответ. но у клиентов и менеджеров есть свои первичные ключи, и я думаю, что это будет подходящим. объясним далее, как это могло бы предотвратить такую ​​вещь? –

+0

Не должны ли ваши таблицы 'Customers' и' Managers' быть фактически 'Customer_Accounts' и' Manager_Accounts'? В противном случае, как клиенты и менеджеры могут иметь несколько учетных записей? – RBarryYoung

+0

@RBarryYoung, ОП описал отношения «один к одному», а не отношения «один ко многим». –

Смежные вопросы