Возникли проблемы с процедурой в MariaDB - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю базу c системы управления аэропортом SQL, используя базу данных MariaDB. Я хочу создать процедуру, содержащую транзакцию, которая гарантирует, что: всякий раз, когда пассажир перемещается на другой рейс, багаж, связанный (принадлежащий) с этим пассажиром, передается на тот же рейс. Я получаю код ошибки:

Код ошибки: 1054. Неизвестный столбец 'Flight_ID' в 'списке полей'

Где находится ошибка? Вот мой код для процедуры вместе с соответствующими таблицами из базы данных:

Код для процедуры

Таблицы, на которые имеются ссылки

Процедура:

DELIMITER //
CREATE PROCEDURE PassengerTransfer (
    IN vPassportNo VARCHAR(9), vOldFlightID VARCHAR(4), vNewFlightID VARCHAR(4), OUT vStatus VARCHAR(45))
BEGIN
    START TRANSACTION;
    SET SQL_SAFE_UPDATES = 0;
    UPDATE TRAVELS
    SET Flight_ID = vNewFlightID
    WHERE Flight_ID = vOldFlightID AND Passport_no = vPassportNo;

    UPDATE CARRIES INNER JOIN LUGGAGE ON LUGGAGE.LuggageID = CARRIES.LuggageID
    SET CARRRIES.Flight_ID = vNewFlightID
    WHERE LUGGAGE.Passport_no = vPassportNo;

    IF (TRAVELS.Flight_ID = vNewFlightID AND TRAVELS.Passport_no = vPassportNo)
    AND (CARRIES.Flight_ID = vNewFlightID AND LUGGAGE.LuggageID = CARRIES.LuggageID
    AND LUGGAGE.Passport_no = vPassportNo)
        THEN SET vStatus = "Trasaction PassengerTransfer committed!"; COMMIT;
        ELSE SET vStatus = "Transaction PassengerTransfer rollback"; ROLLBACK;
    END IF;
END; //
DELIMITER ;

Ссылки на таблицы:

CREATE TABLE Travels(
Passport_no varchar(9) not null,
Flight_ID varchar(4) not null,
PRIMARY KEY (Passport_no),
FOREIGN KEY (Flight_ID) REFERENCES Flight(Flight_ID) ON UPDATE CASCADE,  
FOREIGN KEY (Passport_no) REFERENCES Passenger(Passport_no) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE Luggage(
LuggageID       varchar(5) not null,
Weight          decimal(4,2),                   
Passport_no     varchar(9) not null, 
PRIMARY KEY (LuggageID),
FOREIGN KEY(Passport_no) REFERENCES Passenger(Passport_no) ON UPDATE CASCADE
);

CREATE TABLE Carries(
LuggageID       varchar(5) not null,
Flight_ID   varchar(4) not null,
PRIMARY KEY (LuggageID)
);

1 Ответ

0 голосов
/ 01 апреля 2020

Ключевые слова NEW и OLD доступны только в триггерах, а не в процедурах. Поэтому код, подобный этому:

UPDATE TRAVELS SET NEW.Flight_ID = vNewFlightID
WHERE OLD.Flight_ID = vOldFlightID AND Passport_no = vPassportNo;

должен быть записан как:

UPDATE TRAVELS 
SET Flight_ID = vNewFlightID
WHERE Flight_ID = vOldFlightID AND Passport_no = vPassportNo;

Ваш код:

UPDATE CARRIES SET NEW.Flight_ID = vNewFlightID
WHERE LUGGAGE.LuggageID = CARRIES.LuggageID AND
LUGGAGE.Passport_no = vPassportNo;

должен быть записан как:

UPDATE CARRIES 
   INNER JOIN LUGGAGE ON LUGGAGE.LuggageID=CARRIES.LuggageID
SET CARRIES.Flight_ID = vNewFlightID
WHERE LUGGAGE.Passport_no = vPassportNo;
...