在 MariaDB 中遇到过程问题
Having trouble with a procedure in MariaDB
我正在使用 MariaDB 创建一个基本的机场管理系统 SQL 数据库。我想创建一个包含事务的过程,以确保:
每当乘客被转移到另一个航班时,与该乘客相关(属于)的行李将被转移到同一航班。我不断收到错误代码:
错误代码:1054。'field list'
中的未知列 'Flight_ID'
哪里出错了?这是我的程序代码以及数据库中的相关表:
Code for the procedure
Tables referenced
程序:
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)
);
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;
我正在使用 MariaDB 创建一个基本的机场管理系统 SQL 数据库。我想创建一个包含事务的过程,以确保: 每当乘客被转移到另一个航班时,与该乘客相关(属于)的行李将被转移到同一航班。我不断收到错误代码:
错误代码:1054。'field list'
中的未知列 'Flight_ID'哪里出错了?这是我的程序代码以及数据库中的相关表:
Code for the procedure
Tables referenced
程序:
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)
);
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;