Несколько уникальных значений

Рейтинг: 0Ответов: 1Опубликовано: 23.01.2023

Есть таблица в которой связаны идентификаторы пользователей с идентификаторами задачи.

CREATE TABLE test (
    ID int NOT NULL UNIQUE AUTO_INCREMENT,
    TaskID INT NOT NULL,
    FOREIGN KEY (TaskID) REFERENCES task(ID),
    UserID INT NOT NULL,
    FOREIGN KEY (UserID) REFERENCES users(ID),
);

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

Как это можно реализовать средствами БД?

Ответы

▲ 0

Cоздайте триггер:

DELIMITER $$
CREATE TRIGGER test_prevent_duplicates
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
    DECLARE duplicate INT;
    SELECT COUNT(*) INTO duplicate
    FROM test
    WHERE TaskID = NEW.TaskID AND UserID = NEW.UserID;
    IF duplicate > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Повторяющаяся запись для TaskID и UserID';
    END IF;
END$$
DELIMITER ;

Ещё способ - использовать хранимую процедуру:

CREATE PROCEDURE add_test_record(IN task_id INT, IN user_id INT)
BEGIN
    DECLARE duplicate INT;
    SELECT COUNT(*) INTO duplicate
    FROM test
    WHERE TaskID = task_id AND UserID = user_id;
    IF duplicate > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Duplicate entry for TaskID and UserID';
    ELSE
        INSERT INTO test (TaskID, UserID) VALUES (task_id, user_id);
    END IF;
END;

Ещё могу предложить создать уникальный констрейнт на комбинацию TaskID и UserID в таблице test, чтобы исключить дубликаты записей с одним и тем же таском и айди:

ALTER TABLE test
ADD CONSTRAINT unique_task_user UNIQUE(TaskID, UserID);

при появлении дубликата выбросится ошибка.