sql: как избежать того же идентификатора в строке таблицы - PullRequest
0 голосов
/ 07 сентября 2018
CREATE TABLE follows2 
(
    follower_id INTEGER NOT NULL,
    followee_id INTEGER NOT NULL, 
    created_at TIMESTAMP DEFAULT NOW(),
    FOREIGN KEY (follower_id) REFERENCES users(id),
    FOREIGN KEY (followee_id) REFERENCES users(id),
    PRIMARY KEY(follower_id, followee_id)
);

Как не вставить одинаковые follower_id и followee_id в один ряд?

пример:

ПРАВИЛЬНО:

INSERT INTO follows2 (follower_id, followee_id) VALUES
(1, 2);

НЕПРАВИЛЬНО:

INSERT INTO follows2 (follower_id, followee_id) VALUES
(1, 1);

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Создать trigger

CREATE TRIGGER follows2valuecheckTrigger 
BEFORE INSERT 
ON follows2
  FOR EACH ROW BEGIN
    IF (NEW.follower_id = NEW.followee_id) THEN
      SET msg := 'Error: follower_id and followee_id can not be same.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;

Создание до обновления, а также

CREATE TRIGGER follows2valuecheckTriggerOnUpdate
BEFORE UPDATE
ON follows2
  FOR EACH ROW BEGIN
    IF (NEW.follower_id = OLD.followee_id OR NEW.followee_id=OLD.follower_id) THEN
      SET msg := 'Error: follower_id and followee_id can not be same.';
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;
0 голосов
/ 07 сентября 2018

Если это только в той же строке, вам просто нужно CONSTRAINT с указанием, что follower_id <> followee_id

См. https://www.w3schools.com/sql/sql_constraints.asp

0 голосов
/ 07 сентября 2018

Ваши единственные варианты

  • Не добавляйте ненужные данные
  • Добавьте все данные и отфильтруйте ненужные данные в операторе SELECT. (WHERE follower_id <> followee_id)
  • Используйте триггер для проверки данных перед вставкой. Если это быстрая проверка двух числовых столбцов, это, вероятно, не вызовет особых проблем.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...