Я пытаюсь создать хранимую процедуру, которая будет обновлять один столбец таблицы с возрастающими возрастающими числами.
Код, который у меня есть
CREATE DEFINER='cis23383518'@'192.168.122.1' PROCEDURE 'Increment_rows'(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN
DECLARE i INT;
SET i = 0;
UPDATE TheTable
SET TheID = i,i= i+1;
END
Я называю процедуру следующим образом
CALL Increment_rows('Officer','IncidentID');
Я получаю следующую ошибку: Таблица cis23383518.TheTable не существует.
mysql не будет подставлять имя таблицы с предоставленным параметром, обновление ищет таблицу, называемую таблицей. Если вы хотите указать имя таблицы для этой процедуры, вам нужно будет построить инструкцию sql и подать, например
DROP PROCEDURE IF EXISTS 'Increment_rows';
DELIMITER $$
CREATE PROCEDURE 'Increment_rows'(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN
set @sqlstmt = concat('UPDATE ', THETABLE, ' SET STATUS = (SELECT @I:=@I + 1 FROM (SELECT @I:=0) I) ORDER BY ID DESC;');
SELECT @SQLSTMT;
prepare stmt from @sqlstmt;
execute stmt;
deallocate prepare stmt;
END $$
Обратите внимание на использование переменной для увеличения столбца состояния. так что
+----+----------+--------+
| id | username | status |
+----+----------+--------+
| 1 | John | 0 |
| 2 | Jane | 0 |
| 3 | Ali | 0 |
| 6 | Bruce | 0 |
| 7 | Martha | 0 |
| 8 | Sidney | 0 |
| 10 | charlie | 0 |
| 12 | Elisa | 0 |
| 14 | Samantha | 0 |
| 15 | Hannah | 0 |
| 16 | Hannah | 0 |
| 17 | Kevin | 0 |
| 18 | Kevin | 0 |
| 19 | Ruth | 0 |
+----+----------+--------+
14 rows in set (0.00 sec)
MariaDB [sandbox]> CALL Increment_rows('USERS','INCIDENTID');
+----------------------------------------------------------------------------------------+
| @SQLSTMT |
+----------------------------------------------------------------------------------------+
| UPDATE USERS SET STATUS = (SELECT @I:=@I + 1 FROM (SELECT @I:=0) I) ORDER BY ID DESC; |
+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
MariaDB [sandbox]> select id,username,status from users;
+----+----------+--------+
| id | username | status |
+----+----------+--------+
| 1 | John | 14 |
| 2 | Jane | 13 |
| 3 | Ali | 12 |
| 6 | Bruce | 11 |
| 7 | Martha | 10 |
| 8 | Sidney | 9 |
| 10 | charlie | 8 |
| 12 | Elisa | 7 |
| 14 | Samantha | 6 |
| 15 | Hannah | 5 |
| 16 | Hannah | 4 |
| 17 | Kevin | 3 |
| 18 | Kevin | 2 |
| 19 | Ruth | 1 |
+----+----------+--------+
14 rows in set (0.02 sec)
Примечание. Мне кажется, что вашему оператору обновления может понадобиться оператор where.
REFINER не является обязательным.
Если вы вызываете процедуру с тем же идентификатором пользователя, для которого она была создана, просто отпустите ее:
CREATE PROCEDURE 'Increment_rows'(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN
DECLARE i INT;
SET i = 0;
UPDATE TheTable
SET TheID = i,i= i+1;
END