Триггер Mysql заставляет запросы занимать неограниченное время - PullRequest
0 голосов
/ 12 марта 2020

У меня есть таблица студентов, которая включает в себя следующие поля

Student_Id int primary key

student_name varchar(50)

seat_number varchar(50)

level_id int foreign key

CREATE TABLE `students` (
`Student_Id` int(11) NOT NULL AUTO_INCREMENT,
`student_name` varchar(100) DEFAULT NULL,
`level_id` int(11) DEFAULT NULL,
`seat_number` varchar(50) DEFAULT NULL,
 KEY `Relationship17` (`level_id`),
 CONSTRAINT `Relationship17` FOREIGN KEY (`level_id`) REFERENCES `levels` (`Level_Id`) ON DELETE CASCADE ON UPDATE CASCADE)

Моя цель

Установить уникальные значения в поле seat_number с помощью запроса

FLOOR(rand() * 90000 + 10000)

А затем объединить результат с символом на основе Значение level_id.

Поэтому я создаю следующий триггер:

DELIMITER $$
CREATE TRIGGER seat_nu_trigger BEFORE INSERT ON students FOR EACH ROW
BEGIN
DECLARE x CHARACTER;
DECLARE cur cursor for select FLOOR(rand() * 90000 + 10000) from students;
open cur;
if NEW.level_id=1 THEN
set x = 'A';
ELSEIF
NEW.level_id=2 THEN
set x = 'B'; 
END IF;
getSeatNumber: LOOP
SET NEW.seat_number = concat(x,FLOOR(rand() * 90000 + 10000) );
END LOOP getSeatNumber;
CLOSE cur;
END;

Проблема

Когда я вставляю какие-либо данные в свою таблицу, это не вставлен и запрос занимает неограниченное время.

Я не могу сбросить курок.

Ответы [ 2 ]

1 голос
/ 12 марта 2020
CREATE TRIGGER seat_nu_trigger 
BEFORE INSERT 
ON students 
FOR EACH ROW
SET NEW.seat_number = CONCAT(CASE NEW.level_id WHEN 1 THEN 'A'
                                               WHEN 2 THEN 'B'
                                               END, FLOOR(rand() * 90000 + 10000) );

ПС-1. Если для level_id установлено значение, отличное от A или B, для seat_number будет установлено значение NULL.

PS-2. * Длина 1008 * будет переменной. Подумайте о дополнительных LPAD().

PS-3. seat_number Уникальность не гарантируется.

0 голосов
/ 12 марта 2020
CREATE TRIGGER seat_nu_trigger BEFORE INSERT ON students FOR EACH ROW
BEGIN

DECLARE valid_code TEXT;
DECLARE good_code BIT;

SET good_code = FALSE;

WHILE (NOT good_code) DO
    SET valid_code = CONCAT(
           (CASE NEW.level_id 
               WHEN 1 THEN 'A'
               WHEN 2 THEN 'B'
           END), 
           FLOOR(rand() * 90000 + 10000)
    );

    SET good_code = (SELECT COUNT(1) FROM students WHERE seat_number = valid_code) = 0;
END WHILE;

SET NEW.seat_number = valid_code;

Попробуйте это, он сгенерирует случайное число и проверка сгенерированного кода существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...