прервать выполнение хранимой процедуры (mysql) в переполнении стека

Я написал хранимую процедуру (mysql)

CREATE PROCEDURE `set_SiteAttendance`(IN _UserName VARCHAR(20)  CHARSET utf8, IN _EventDesc VARCHAR(250)  CHARSET utf8, IN _EventTime BIGINT(20))
BEGIN

DECLARE _EventID INT;
DECLARE cursorGetID CURSOR FOR

SELECT id
FROM client_pages
WHERE name = _EventDesc
LIMIT 0, 1;

-- try to add a new record to the database
INSERT INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;

-- get id from the database records
OPEN cursorGetID;
FETCH cursorGetID INTO _EventID;

-- set the data on the visit of the page in the database
INSERT INTO login_history VALUES (NULL, _UserName, _EventID, _EventTime);

END

Когда я вызываю его с помощью MySQL Workbench, он работает правильно.

CALL set_SiteAttendance('MyName', 'page#1', 100);

Когда я называю это с помощью php, то хранимая процедура прерывается в операторе INSERT:

$query = "CALL set_SiteAttendance('$user_name', '$user_page', $user_ticks)";
mysql_query($query);

mysql_error () вызывает проблемы

Дублирующая запись «страница № 1» для ключа «имя»

почему это происходит и как исправить?

0

Решение

Ну, это довольно очевидно. У вас есть уникальный индекс на nameтак что ваш запрос INSERT INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages; может быть запущен только один раз с тем же _EventDesc параметр.

Удалите индекс или измените логику вашей процедуры.

0

Другие решения

Я решил свою проблему:

INSERT IGNORE INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;

Ошибка (имя найдено) была проигнорирована и процедура не прерывается

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector