我有一组由id定义的点,以及一个数据库表,用于定义这些点之间的连接:
[point1,point2]
现在我可以强制执行point1和point2的排列是唯一的。所以只有一个条目 point1 = x 和 point2 = y 。但我想要独特的组合,这意味着如果有一个 point1 = x 和 point2 = y 的条目,则不应该使用 point1获得一个条目= y 和 point2 = x 。
是否可以为此配置表格,还是必须通过代码强制执行此操作?
答案 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)
我会用
的组合来解决这个问题(point1, point2)
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不同,我会调用非使触发器失败的现有程序,避免插入新记录。