







|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
38367
|
|