Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Как вставить комбинацию уникальных значений? (mee) 26/04/2011 - 11:33:34
      Re: Как вставить комбинацию уникальных значений? (mee) 26/04/2011 - 12:37:51



From: mee - 26/04/2011 - 11:33:34
Subject:Как вставить комбинацию уникальных значений?
-----------------
Здравствуйте.

Требуется вставляя строку в таблицу изменить комбинацию двух полей так, чтобы она была уникальной. Хочу сделать это средствами MySQL.
Теперь подробнее. Есть таблица координатми (x,y) точек, координаты у каждой точки должны быть уникальными, причем смещение координат хранится в таблице `settings` (допустим, offset=30), откуда его и следует брать при добавлении очередной координаты.

CREATE TABLE `settings` (
`name` varchar(32) not null,
`value` varchar(32) not null,
unique (`name`)
);
INSERT INTO `settings` VALUES ('offset','30');

CREATE TABLE `coord` (
`id` int unsigned not null auto_increment,
`x` int not null,
`y` int not null,
primary key (`id`),
unique (`x`,`y`)
);

Теперь, когда происходит INSERT, должна происходить проверка на существование комбинации (x,y), и если такая существует, сместить x=x+30 и снова проверить. Я пытался сделать триггером, но триггер зависет на WHILE:

DELIMITER $$
DROP TRIGGER IF EXISTS `check_xy`;
CREATE TRIGGER `check_xy` BEFORE INSERT ON `coord`
FOR EACH ROW BEGIN
DECLARE `tx` INTEGER DEFAULT 0;
DECLARE `ty` INTEGER DEFAULT 0;
DECLARE `busy` TINYINT(1) DEFAULT NULL;
DECLARE `offset` INTEGER DEFAULT 0;

SELECT CONVERT(`value`,UNSIGNED INTEGER) INTO `offset` FROM `settings` WHERE `name`='offset';

SELECT `id` INTO `busy` FROM `coord` WHERE `x`=`tx` AND `y`=`ty`;
WHILE (`busy` IS NOT NULL) DO
SET `tx`=`tx`+`offset`;
SELECT `id` INTO `busy` FROM `coord` WHERE `x`=`tx` AND `y`=`ty`;
END WHILE;

SET NEW.`x`=`tx`;
SET NEW.`y`=`ty`;
END$$
DELIMITER ;

Делаю 2 запроса, первый проходит, а второй заткается, т.к. начинает работать тело WHILE:

INSERT INTO `coord` VALUES (NULL,0,0);
mysql> INSERT INTO `coord` VALUES (NULL,0,0);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO `coord` VALUES (NULL,0,0);
^CCtrl-C -- sending "KILL QUERY 28823" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

mysql> SELECT * FROM `coord`;
+----+---+---+
| id | x | y |
+----+---+---+
| 1 | 0 | 0 |
+----+---+---+
1 row in set (0.00 sec)

mysql>

Видимо, я нарушаю какие-то правила создания триггеров, но пока не понял, где косяк.
Прошу помощи. Возможно, есть более грамотный способ решить задачу?


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
38367



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |