Ограничить количество записей, используя триггер и ограничения в MySQL - PullRequest
0 голосов
/ 08 марта 2012

У меня есть таблица с именем BFFs, в которой хранятся userID и userDid лучшего друга, и я хотел бы ограничить эту таблицу ровно 3 лучшими друзьями для каждого отдельного пользователя.

Я имею в виду, если таблицаstructre:

BFFs(userID, userID)

и записи:

(3286, 1212)
(3286, 4545)
(3286, 7878)

И в этом случае, если пользователю с идентификатором 3286 не должно быть разрешено иметь новую запись, такую ​​как (3286, xyzt).

Я написал этот триггер, но я не уверен:

CREATE TRIGGER BFFControl
BEFORE INSERT ON BFFs
FOR EACH ROW
DECLARE
    numberOfBFFs INTEGER;
    max_BFFs INTEGER := 3;
BEGIN
    SELECT COUNT(*) INTO numberOfBFFs
    FROM BFFs
    WHERE sender =: NEW.sender

    IF :OLD.sender =: NEW.sender THEN
        RETURN;
    ELSE
        IF numberOfBFFs >= max_BFFs THEN
            RAISE_APPLICATION_ERROR(-20000, 'Users are allowed to have at most thre friends.');
        END IF;
    END IF;
END;
/

Как мне изменить это в реляционных таблицах с помощью утверждений или триггеров?

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Добавить еще один столбец, FriendNumber и ограничение внешнего ключа в справочную таблицу с ровно 3 строками:

CREATE TABLE Three
( friendNumber TINYINT NOT NULL 
, PRIMARY KEY (friendNumber)
) ;

INSERT INTO Three(friendNumber) 
  VALUES
    (1), (2), (3) ;

CREATE TABLE BFFs
( userID       INT NOT NULL 
, friendID     INT NOT NULL
, friendNumber TINYINT NOT NULL
, PRIMARY KEY (userID, friendID)
, UNIQUE (userID, friendNumber)
, FOREIGN KEY userID
    REFERENCES Person(userID)
, FOREIGN KEY friendID
    REFERENCES Person(userID) 

, FOREIGN KEY friendNumber           --- this ensures that a user can have
    REFERENCES Three(friendNumber)   --- max of 3 friends
) ;

Тогда вы можете добавить:

INSERT INTO BFFs 
  (userID, friendID, friendNumber)
VALUES
  (3286, 1212, 1) ,
  (3286, 4545, 2) ,
  (3286, 7878, 3) ;

или, как предлагает @gbn, примерно так (столбец заполняется автоматически):

INSERT INTO BFFs 
    (userID, friendID, friendNumber)
  SELECT 
       3286 AS userID
     , 8989 AS friendID
     , COALESCE(
         ( SELECT MIN(Three.friendNumber)
           FROM Three 
             LEFT JOIN BFFs AS b  
               ON  b.friendNumber = Three.friendNumber
               AND b.userID = 3286
           WHERE b.friendNumber IS NULL
         ), 4
       ) AS friendNumber
  FROM dual
1 голос
/ 08 марта 2012

В дополнение к ответу ypercubes (который использует DRI для обеспечения соблюдения вашего правила), вы также можете ВСТАВИТЬ ВСТУПИТЬ с MIN, чтобы получить следующие 1, 2 или 3 из таблицы Three на идентификатор пользователя

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