如何在MySQL中强制执行两个相似字段的唯一组合

时间:2011-07-20 19:20:58

标签: mysql field

我有一组由id定义的点,以及一个数据库表,用于定义这些点之间的连接

[point1,point2]

现在我可以强制执行point1和point2的排列是唯一的。所以只有一个条目 point1 = x point2 = y 。但我想要独特的组合,这意味着如果有一个 point1 = x point2 = y 的条目,则不应该使用 point1获得一个条目= y point2 = x

是否可以为此配置表格,还是必须通过代码强制执行此操作?

4 个答案:

答案 0 :(得分:1)

这个结构应该对你有用吗?

<强> CORRECT

--
-- Table structure for table `points`
--

CREATE TABLE IF NOT EXISTS `points` (
  `point1` int(11) NOT NULL,
  `point2` int(11) NOT NULL,
  UNIQUE KEY `point1_point2_ux` (`point1`,`point2`),
  UNIQUE KEY `point2_point1_ux` (`point2`,`point1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Triggers `points`
--
DROP TRIGGER IF EXISTS `testpoints`;
DELIMITER //
CREATE TRIGGER `testpoints` BEFORE INSERT ON `points`
 FOR EACH ROW BEGIN
  DECLARE num INTEGER DEFAULT 0;
  DECLARE point INTEGER DEFAULT NULL;

  SELECT count(*) INTO num FROM points WHERE point2 = NEW.point1 AND point1 = NEW.point2;

  IF(num>0) THEN
    SET point = NEW.point1;
    SET NEW.point1 = NEW.point2;
    SET NEW.point2 = point;
  END IF;

  END
//
DELIMITER ;

答案 1 :(得分:0)

我会用

的组合来解决这个问题
  1. (point1, point2)
  2. 上的唯一索引
  3. 强制执行point1 <= point2的触发器(即,如果违反该条件,则触发触发器中的两个值)。

答案 2 :(得分:0)

我建议搜索该组合

SELECT id WHERE pointx = 'value' AND pointy = 'value';寻找那个组合。

$numrows = mysql_num_rows($result);

if($numrows !> 0){ //do what ever with the points. }

答案 3 :(得分:0)

此触发器可以完成任务:

DELIMITER $$

CREATE
    TRIGGER `db`.`on_points_before_insert` BEFORE INSERT
    ON `db`.`points`
    FOR EACH ROW BEGIN
    DECLARE num_reg INT;

    SELECT COUNT(*) FROM points WHERE 
    (p1 = new.p1 AND p2 = new.p2) OR (p1 = new.p2 AND p2 = new.p1)  INTO num_reg;
    IF(num_reg != 0) THEN
        CALL my_non_existant_procedure();
    END IF;
    END$$

DELIMITER ;

我只是通过计算条件(p1 = new.p1 AND p2 = new.p2) OR (p1 = new.p2 AND p2 = new.p1)返回的记录数来测试是否存在您尝试插入的值的组合,如果该数字与0不同,我会调用非使触发器失败的现有程序,避免插入新记录。