Как применить уникальную комбинацию двух одинаковых полей в MySQL - PullRequest
3 голосов
/ 20 июля 2011

У меня есть набор точек, определенных идентификатором, и таблица базы данных, которая определяет соединение между этими точками:

[точка1, точка2]

Теперь я могу убедиться, что перестановки точек 1 и 2 уникальны.Таким образом, есть только 1 запись, где point1 = x и point2 = y .Но мне нужны уникальные комбинации, то есть если есть запись с point1 = x и point2 = y , получить запись с point1 = y невозможно. и point2 = x .

Можно ли настроить таблицу для этого или я должен принудительно применить это через код?

Ответы [ 4 ]

1 голос
/ 20 июля 2011

Эта структура должна работать у вас, может быть?

ПРАВИЛЬНО

--
-- 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 ;
0 голосов
/ 20 июля 2011

Этот триггер сделает работу:

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, я вызываю несуществующую процедуру чтобы вызвать сбой триггера и избежать вставки новой записи.

0 голосов
/ 20 июля 2011

Я бы посоветовал поискать этот комбо как

SELECT id WHERE pointx = 'value' AND pointy = 'value'; ищите это комбо.

$numrows = mysql_num_rows($result);

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

0 голосов
/ 20 июля 2011

Я бы подошел к этому с помощью комбинации

  1. уникального индекса (point1, point2)
  2. триггера для принудительного применения point1 <= point2 (т. Е. Сторнируйте два значения всрабатывать, если они нарушают это условие).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...