SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.03.2011 15:01:52

_front_
Участник
Зарегистрирован: 01.03.2011
Сообщений: 3

Нужна помощь (или ткнуть носом)

Добрый день администрация и пользователи ресурса!

Это мои первые шаги в MySQL, сильно не пинайте, если что.
Нужна помощь в решении проблемы.
Имеем:
База: `testdb`
в ней две таблицы:
`tab1` - назначение: заносить данные, название продукта, кол-во, дата.
`tab2` - назначение: автоматическое формирование данных, извлечение из `tab1` уникальных названий, после чего ручной внос описания продукта

Застрял на этапе формирования данных в таблице `tab2` пробую триггер, ниже, нарисовал этот бред, на мой взгляд, но не знаю как лучше и как в нем прописать проверку на существование в таблице `tab2` этой записи, дабы не было задвоений в колонке `name`

триггер тестовый
################################


DELIMITER $$

USE `testdb`$$

DROP TRIGGER /*!50032 IF EXISTS */ `new_test`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `new_test` AFTER INSERT ON `tab1`
    FOR EACH ROW BEGIN
    INSERT INTO testdb.tab2 (id, `name`) VALUES ('', (SELECT name FROM testdb.tab1 WHERE Id=(SELECT MAX(Id) FROM testdb.tab1)));
   END;
$$

DELIMITER ;
 

#################################
Ступор вобщем, подскажите пожалуйста решение.

Неактивен

 

#2 01.03.2011 19:48:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь (или ткнуть носом)

Кажется, достаточно уникального индекса на tab2(name) и INSERT IGNORE в нее
в триггере. Не усложняйте себе жизнь smile

Неактивен

 

#3 01.03.2011 20:49:40

_front_
Участник
Зарегистрирован: 01.03.2011
Сообщений: 3

Re: Нужна помощь (или ткнуть носом)

Таки да! Спасибо.

А если данные из `tab1`.`name` в виде 'part_151\apple' (да странное еще что хранятся слеши как два слеша, не понял зачем , но наверно на то есть причины) то есть, отсечь значение до слэша, узнал что есть REGEXP но синтаксис в мануале туманно описан, можете разжевать?

наверно, как то так ?   
***skip***

INSERT IGNORE INTO testdb.tab2 (id, `name`) VALUES ('', REGEXP "("/.*\\\\/","",(SELECT name FROM testdb.tab1 WHERE Id=(SELECT MAX(Id) FROM testdb.tab1)))");

***skip***

Отредактированно _front_ (01.03.2011 20:51:45)

Неактивен

 

#4 01.03.2011 21:04:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь (или ткнуть носом)

REGEXP не умеет изменять данные, только сопоставлять строку
регулярному выражению. Попробуйте составить замену из обычных
строковых функций — LOCATE, RIGHT.

Неактивен

 

#5 02.03.2011 10:40:38

_front_
Участник
Зарегистрирован: 01.03.2011
Сообщений: 3

Re: Нужна помощь (или ткнуть носом)

Уважаемый! У меня еще есть вопрос.
Пока что получилось что то типа этого:


DELIMITER $$

CREATE

    TRIGGER `testdb`.`tr1` AFTER INSERT
    ON `testdb`.`tab1`
    FOR EACH ROW BEGIN
    INSERT IGNORE INTO testdb.tab2 (id, `name`) VALUES ('', (SELECT RIGHT ( (SELECT `name` FROM testdb.tab1 WHERE Id=(SELECT MAX(Id) FROM testdb.tab1)) , ( LOCATE('\\', REVERSE((SELECT `name` FROM testdb.tab1 WHERE Id=(SELECT MAX(Id) FROM testdb.tab1)))) )-1 )));
    END$$

DELIMITER ;
 


теперь нужно сделать проверку в триггере, на наличие обратного слеша(т.к. если обратного слеша в извлекаемой строке нет, вставляется пустое значение), пока все попытки безуспешны, ошибки синтаксиса, как оно должно выглядеть, подскажите пожалуйста.
пробую так:


DELIMITER $$

CREATE

    TRIGGER `testdb`.`tr1` AFTER INSERT
    ON `testdb`.`tab1`
    FOR EACH ROW BEGIN
    IF (LOCATE('\\', REVERSE((SELECT `name` FROM testdb.tab1 WHERE Id=(SELECT MAX(Id) FROM testdb.tab1))))  = 0)
    THEN
        INSERT IGNORE INTO testdb.tab2 (id, `name`) VALUES ('', (SELECT `name` FROM testdb.tab1 WHERE id=(SELECT MAX(id) FROM testdb.tab1)));
    ELSE
        INSERT IGNORE INTO testdb.tab2 (id, `name`) VALUES ('', (SELECT RIGHT ( (SELECT `name` FROM testdb.tab1 WHERE id=(SELECT MAX(id) FROM testdb.tab1)) , ( LOCATE('\\', REVERSE((SELECT `name` FROM testdb.tab1 WHERE Id=(SELECT MAX(Id) FROM testdb.tab1)))) )-1 )));
    END IF;
    END$$

DELIMITER ;
 

Отредактированно _front_ (02.03.2011 10:56:47)

Неактивен

 

#6 02.03.2011 14:19:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь (или ткнуть носом)

Эээ... а не проще вот так?

Код:

INSERT IGNORE tab2 (name) VALUES (
    IF(
        LOCATE('\\', NEW.name), 
        SUBSTR(NEW.name, LOCATE('\\', NEW.name)),
        NEW.name
    ));

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson