sql:如何避免在表行中使用相同的id

时间:2018-09-07 12:55:17

标签: mysql sql

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 :(得分:2)

创建一个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;

答案 1 :(得分:0)

您唯一的选择是

  • 不要添加不需要的数据
  • 添加所有数据,并在SELECT语句中过滤掉不需要的数据。 (WHERE follower_id <> followee_id
  • 使用触发器在插入之前检查数据。如果快速检查两个数字列,可能不会造成太大麻烦。

答案 2 :(得分:0)

如果仅在同一行中,则只需要一个CONSTRAINT即可说明follower_id <> followee_id

请参见https://www.w3schools.com/sql/sql_constraints.asp