Используйте переменные функции MySql в качестве имени таблицы в запросе - PullRequest
0 голосов
/ 14 апреля 2011

Мне нужна функция, которая увеличивает определенный идентификатор в таблице (например, auto_increment)

У меня есть что-то подобное

DELIMITER $$

DROP FUNCTION IF EXISTS `GetNextID`$$

CREATE FUNCTION `GetNextID`(tblName TEXT, increment INT) 
RETURNS INT 
DETERMINISTIC
    BEGIN
        DECLARE NextID INT;
        SELECT MAX(concat(tblName, 'ID')) + increment INTO NextID FROM concat('table_', tblName);
        ## SELECT MAX(articleID) + increment INTO NextID FROM table_article;
        RETURN NextID;
    END$$

DELIMITER ;

INSERT INTO `table_article` ( articleID, articleAlias ) VALUES ( GetNextID('article', 5), 'TEST' );

Итак, я передаю две переменные: tblName (без префикса table_) и номер приращения. Комментируемая строка - запрос SELECT внутри самой функции - работает хорошо, но я хочу динамически передавать имя таблицы в функцию и получать данные из определенного столбца определенной таблицы. Что я делаю не так?

Ошибка:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('table_', tblName);
RETURN NextID;
END' at line 6 

если я просто попытаюсь выбрать максимальное значение таким образом

SELECT MAX(articleID) + increment INTO NextID FROM tblName;

Ошибка сообщает, что tblName не существует. Как я могу сказать MySql, что это фактически переменная, переданная функции, а не точное имя таблицы? Если это возможно.

1 Ответ

2 голосов
/ 14 апреля 2011

вам нужно что-то вроде

prepare stmp from concat('SELECT MAX(ID) + ', increment, ' INTO NextID FROM table_', tblName); 
execute stmp; 
deallocate prepare stmp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...