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




MySQL.RU - Webboard



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

> Original message text:
> 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>
>
> Видимо, я нарушаю какие-то правила создания триггеров, но пока не понял, где косяк.
> Прошу помощи. Возможно, есть более грамотный способ решить задачу?
>


From: mee - 26/04/2011 - 12:37:51
Subject:Как вставить комбинацию уникальных значений?
-----------------
Решено добавлением в тело цикла строки 'SET `busy`=NULL;':

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

Оказалось, значение переменной `busy` не затрагивается, если возвращается 0 строк (я ожидал, что она примет NULL).


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

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

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



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