MySQL напротив внешнего ключа - PullRequest
0 голосов
/ 08 марта 2012

У меня есть 2 таблицы, клиенты и филиалы. Мне нужно убедиться, что клиенты customer.email и affiliates.email являются эксклюзивными. Другими словами, человек не может быть и клиентом, и партнером. Это в основном противоположность внешнего ключа. Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Вы можете использовать таблицу, которая хранит электронные письма и имеет уникальные ограничения на электронную почту, и ссылаться на эту таблицу от клиента и партнера. (все еще необходимо убедиться, что нет двух записей, ссылающихся на тот же ключ )

Вы можете использовать триггер перед вставкой и перед обновлением, чтобы проверить, отсутствует ли электронная почта.

Или вы можете оставить эту проверку логике приложения - не в базе данных, а в коде приложения.

1 голос
/ 08 марта 2012

Нет ключа, с которым вы можете сделать это, но, похоже, вам не следует использовать две таблицы.Вместо этого вы можете иметь одну таблицу с данными клиента / партнера (которая должна быть уникальной в этой таблице) и другую таблицу с типом (клиент / партнер).

0 голосов
/ 09 марта 2012

Вы можете попробовать следующее.Создайте новую таблицу, которая будет главной для клиентов и филиалов:

CREATE TABLE party
( 
  id int not null auto_increment primary key ,
  party_type enum('customer','affiliate') not null,
  email varchar(100),
  UNIQUE (id,party_type)
);
--Then
CREATE TABLE customer
(
   ....
   party_id INT NOT NULL,
   party_type enum('customer') NOT NULL DEFAULT 'customer',
   PRIMARY KEY (party_id,party_type)
   FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type)
);
CREATE TABLE affiliates
(
   ....
   party_id INT NOT NULL,
   party_type enum('affiliate') NOT NULL DEFAULT 'affiliate',
   PRIMARY KEY (party_id,party_type)
   FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type)
)
-- enum is used because mysql still doesn't have CHECK constraints  

Таким образом, каждая сторона может быть только одного типа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...