Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使两个外键唯一?_Mysql_Unique_One To One - Fatal编程技术网

Mysql 如何使两个外键唯一?

Mysql 如何使两个外键唯一?,mysql,unique,one-to-one,Mysql,Unique,One To One,我有两张桌子 MY_ENTITY ---------------------------------------------------- ID BIGINT (PK) YOUR_ENTITY_ID_1 BIGINT NOT NULL (FK) OneToOne ||--| YOUR_ENTITY_ID_2 BIGINT NULL (FK) OneToOne ||--|

我有两张桌子

MY_ENTITY
----------------------------------------------------
ID               BIGINT                (PK)
YOUR_ENTITY_ID_1 BIGINT    NOT NULL    (FK) OneToOne ||--|
YOUR_ENTITY_ID_2 BIGINT        NULL    (FK) OneToOne ||--|
                                                         |
YOUR_ENTITY                                              |
----------------------------------------------------     |
ID               BIGINT                (PK) -------------|
我想我可以使每个
您的\u实体\u ID\u X
列都是唯一的


我怎样才能在所有
您的\u实体ID\u X
列中确保只有一个
您的\u实体

表结构:

CREATE TABLE MY_ENTITY (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    ENTITY_ID_1 INT UNSIGNED UNIQUE,
    ENTITY_ID_2 INT UNSIGNED UNIQUE,
    UNIQUE(ENTITY_ID_1, ENTITY_ID_2)
);
触发器,它将阻止插入:

DROP TRIGGER IF EXISTS ONLY_UNIQUE_ENTITIES;
DELIMITER //
CREATE TRIGGER ONLY_UNIQUE_ENTITIES BEFORE INSERT ON `MY_ENTITY`
FOR EACH ROW
BEGIN
    DECLARE entity_exists INT DEFAULT 0;
    SELECT 
        COUNT(*) INTO entity_exists
    FROM 
        `MY_ENTITY` 
    WHERE 
        (`ENTITY_ID_1` IN (NEW.ENTITY_ID_1, NEW.ENTITY_ID_2)) 
      OR
        (`ENTITY_ID_2` IN (NEW.ENTITY_ID_1, NEW.ENTITY_ID_2));
    IF entity_exists THEN
        SET NEW.ENTITY_ID_1 = NEW.ENTITY_ID_2;
    END IF;     
END;

这是一种有点粗俗的方法,使用触发器

表结构:

CREATE TABLE MY_ENTITY (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    ENTITY_ID_1 INT UNSIGNED UNIQUE,
    ENTITY_ID_2 INT UNSIGNED UNIQUE,
    UNIQUE(ENTITY_ID_1, ENTITY_ID_2)
);
触发器,它将阻止插入:

DROP TRIGGER IF EXISTS ONLY_UNIQUE_ENTITIES;
DELIMITER //
CREATE TRIGGER ONLY_UNIQUE_ENTITIES BEFORE INSERT ON `MY_ENTITY`
FOR EACH ROW
BEGIN
    DECLARE entity_exists INT DEFAULT 0;
    SELECT 
        COUNT(*) INTO entity_exists
    FROM 
        `MY_ENTITY` 
    WHERE 
        (`ENTITY_ID_1` IN (NEW.ENTITY_ID_1, NEW.ENTITY_ID_2)) 
      OR
        (`ENTITY_ID_2` IN (NEW.ENTITY_ID_1, NEW.ENTITY_ID_2));
    IF entity_exists THEN
        SET NEW.ENTITY_ID_1 = NEW.ENTITY_ID_2;
    END IF;     
END;