Несколько уникальных значений
Есть таблица в которой связаны идентификаторы пользователей с идентификаторами задачи.
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),
);
Пользователю можно внести запись с идентификатором задачи только один раз.
Т.е одному пользователю можно присвоить любое количество задач но они не должны повторяться.
К одной задаче может иметь доступ любое количество пользователей.
Как это можно реализовать средствами БД?
Ответы (1 шт):
Автор решения: versetty777
→ Ссылка
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);
при появлении дубликата выбросится ошибка.