MySQL ДО ВСТАВКИ TRIGGER не влияет на первую запись записи - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь вычислить дифференциальный столбец таблицы результатов при вставке в базу данных MySQL 8.0 с использованием триггера перед. В расчетах также используется таблица учеников. Триггер работает нормально на всех записях в таблице, кроме первой, которая не обновляется. Есть что-то, чего мне не хватает? Весь соответствующий код приведен ниже.

CREATE TABLE coursetee (
    teeID INT UNSIGNED AUTO_INCREMENT, 
    tee_name VARCHAR(20) NOT NULL, 
    course_rating DECIMAL(3,1) NOT NULL, 
    slope_rating INT UNSIGNED NOT NULL,
    par INT UNSIGNED,
    CONSTRAINT pk_coursetee PRIMARY KEY (teeID),   

CREATE TABLE score (
    roundID INT UNSIGNED AUTO_INCREMENT,  
    teeID INT UNSIGNED, 
    round_score INT UNSIGNED NOT NULL,
    round_date DATETIME NOT NULL,
    entry_date DATETIME DEFAULT NOW() NOT NULL,
    differential DECIMAL(3,1),  
    CONSTRAINT pk_score PRIMARY KEY (roundID),
    CONSTRAINT fk_score_coursetee FOREIGN KEY (teeID) REFERENCES coursetee(teeID));    

DELIMITER $$
    CREATE TRIGGER calculate_differential
    BEFORE INSERT ON score
    FOR EACH ROW
    BEGIN
        SET NEW.differential = (SELECT ROUND((113/ct.slope_rating)*(NEW.round_score-ct.course_rating),1) 
            FROM score, coursetee as ct
            WHERE NEW.teeID = ct.teeID AND differential IS NULL);
    END$$
DELIMITER ;

INSERT INTO coursetee 
    (courseID,tee_name,course_rating,slope_rating,par)
    VALUES
    (1,'Back',74.7,143,72),
    (1,'Middle',72.6,136,72),
    (1,'Front',71.3,132,72),
    (2,'Back',76.8,155,72),
    (2,'Middle',73.9,146,72),
    (2,'Front',65.3,125,72);    

INSERT INTO score
    (playerID,teeID,round_score,round_date)
    VALUES
    (1,2,79,'2019-07-25');

INSERT INTO score
    (playerID,teeID,round_score,round_date)
    VALUES
    (2,2,80,'2019-07-25');

INSERT INTO score
    (playerID,teeID,round_score,round_date)
    VALUES
    (1,2,77,'2019-08-06');

Запрос возвращает: изображение запроса, не возвращающего вычисленную запись для строки 1

Ответы [ 2 ]

0 голосов
/ 25 марта 2020
CREATE TRIGGER calculate_differential
BEFORE INSERT 
ON score
FOR EACH ROW
SET NEW.differential = ( SELECT ROUND((113/ct.slope_rating)*(NEW.round_score-ct.course_rating),1) 
                         FROM coursetee ct
                         WHERE NEW.teeID = ct.teeID);

fiddle

Проблема заключалась в использовании таблицы score в качестве источника подзапроса. И надежда на то, что differential ДО вставки первой записи даст что-нибудь, кроме НЕ НАЙДЕНО. И тестирование поля записи ДО ВСТАВКИ для NULL не имеет смысла.

0 голосов
/ 25 марта 2020

Мое предположение о предложении FROM дифференциального запроса в триггере. я бы посоветовал вам попробовать изменить порядок таблиц -

FROM score, coursetee as ct

на

FROM coursetee as ct, score

Похоже, он пытается ничего не извлечь для первой вставки ...

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