Сделайте столбец уникальным в двух таблицах в нашей базе данных - PullRequest
2 голосов
/ 04 октября 2011

Я столкнулся с проблемой в моей нынешней компании, где у них есть учетная запись и член.По тем или иным причинам оба хранятся в отдельных таблицах.

Прямо сейчас можно зарегистрировать пользователя и учетную запись.Это нормально, за исключением того, что пользователи как участника, так и учетной записи могут иметь одинаковое имя пользователя.Это, конечно, как вы все знаете, просто неправильно.Тем более, что они используют имя пользователя для входа в одну и ту же систему, за исключением с разными уровнями функциональности.

Сейчас мы проводим проверку на уровне приложения, и нам просто интересно, можно ли заставить базу данных обеспечить уникальность двух столбцов, скажем, как объединение двух таблиц.

Не могу установить их в качестве первичного или внешнего ключа в данный момент, но это все равно на будущее.Прямо сейчас ищу быстрое решение.В будущем я, вероятно, объединю базы данных и добавлю всех участников как новые строки в таблицу учетных записей и добавлю логическое значение для IsMember.

Ответы [ 4 ]

4 голосов
/ 04 октября 2011

В целом, я согласен с консенсусным мнением, что лучше исправить дизайн, чем вносить исправления с помощью триггеров. Тем не менее, правильно реализованное решение на основе триггера все еще, вероятно, лучше, чем ваша текущая ситуация.

Если вы собираетесь использовать триггеры, правильный способ сделать это:

  1. Создайте новую таблицу, которая не будет содержать ничего, кроме имен пользователей, с первичным ключом, обеспечивающим уникальность (на самом деле это может быть хорошим кандидатом для таблицы, организованной indes).
  2. Создайте триггеры перед вставкой в ​​обеих существующих таблицах, которые добавляют новое имя пользователя в новую таблицу. Если новое имя пользователя уже существует, будет выдана ошибка, предотвращающая вставку обеих строк. Конечно, приложение должно уметь обрабатывать эту ошибку изящно (по-видимому, это уже возможно для сценариев, в которых новое имя пользователя уже существует в таблице, в которую оно добавляется).

Неправильный способ сделать это - выбрать триггер из другой таблицы для проверки уникальности.

2 голосов
/ 04 октября 2011

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

1 голос
/ 04 октября 2011

Рекомендуемые триггеры имеют тенденцию быть очень хрупкими при одновременной транзакции.

Что вы можете сделать (AFAIK) - создать материализованное представление, содержащее объединение рассматриваемого столбца, и наложить уникальное ограничение на этот столбец.

Убедитесь, что вы делаете некоторые тесты производительности.

1 голос
/ 04 октября 2011

При использовании шаблона мягкого удаления. Триггер может использоваться (на каждой таблице) как временная мера.

Вставив отключенную запись в другую таблицу, вы получите ошибку, если другая запись уже существует

Помните, что это правило не будет применяться к существующим данным, будут проверяться только вставленные записи

Примерно так:

-- Insert into the accounts table too
CREATE OR REPLACE TRIGGER tr_member_chk 
BEFORE INSERT ON members
FOR EACH ROW 
BEGIN
    INSERT INTO account (name, id, etc, isenabled) VALUES(:new.name, :new.id, :new.etc, 0);
END;

-- Insert into the members table too
CREATE OR REPLACE TRIGGER tr_account_chk 
BEFORE INSERT ON accounts
FOR EACH ROW 
BEGIN
    INSERT INTO members (name, id, etc,isenabled) VALUES(:new.name, :new.id, :new.etc,0);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...