procedure里面给表添加一行,但是ON DELETE NO ACTION ON UPDATE NO ACTION,

LB4229 2014-07-15 03:27:08
有点长,谁有耐心能不能给看看是哪的问题,谢谢
下面的表是给定的。

-- Table structure for table `reservation`
--

DROP TABLE IF EXISTS `reservation`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `reservation` (
`ReservationID` int(11) NOT NULL,
`Matrikelnummer` int(11) NOT NULL,
`NoReservedSeats` int(11) NOT NULL,
`Comment` varchar(1000) DEFAULT NULL,
`FlightNo` varchar(7) NOT NULL,
`DepartureDateAndTimeUTC` timestamp
NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ReservationID`),
KEY `Matrikelnummer` (`Matrikelnummer`),
KEY `FlightNo` (`FlightNo`,`DepartureDateAndTimeUTC`),
CONSTRAINT `reservation_ibfk_1` FOREIGN KEY (`Matrikelnummer`)
REFERENCES `customer` (`Matrikelnummer`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `reservation_ibfk_2` FOREIGN KEY (`FlightNo`, `DepartureDateAndTimeUTC`)
REFERENCES `flightexecution` (`FlightNo`, `DepartureDateAndTimeUTC`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;



上面是给定的表格。我想插入新的订单。写了下面的代码


-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
/* 给定的是`booking`(in matrikelnummer int, in flight varchar(7), in departure timestamp, in noofseats int, out success int)
* 乘客进行预定需要给个预订号matrikelnummer,给出航班号flight,给出出发时间departure,给出想订几个座位noofseats,
* 如果预定成功就把success标记位1,不成功就标记为0
* /

/*我的思路是,首先要看飞机上待订的座位还剩多少,这个可以通过 freeSeats(flight, departure) 函数得到。
* 然后后把表reservation里面的两个外键取消限制
*/
CREATE DEFINER=`root`@`localhost` PROCEDURE `booking`(in matrikelnummer int,
in flight varchar(7),
in departure timestamp,
in noofseats int,
out success int)
BEGIN

DECLARE freeSeats INT Default 0;
select freeSeats(flight, departure) into freeSeats; -- 第一步,求飞机上剩余多少座位

SET @last_ID = LAST_INSERT_ID(); -- reservation的表里面最后一行的行号是多少,一会儿想在此行后面加入新行

CASE
WHEN noofseats <= freeseats THEN -- 如果乘客预定的座位数小于飞机上的剩余座位数,也就是说客人能订上座位
SET success = 1; -- 那就标记为可以成功预定座位

-- 把两个外键的限制去掉,以便加入新的行
alter table `reservation` drop foreign key `reservation_ibfk_1` ;
alter table `reservation` drop foreign key `reservation_ibfk_2` ;

insert into reservation -- 把booking里面的内容添加入此表
(ReservationID,Matrikelnummer,NoReservedSeats,Comment,FlightNo,DepartureDateAndTimeUTC)
values(@last_ID,matrikelnummer, noofseats,'',flight,departure);

insert into customer(`Matrikelnummer`) -- 相关联外键的表格也加入相关信息
values(matrikelnummer);

insert into flightexecution(`FlightNo`, `DepartureDateAndTimeUTC`)
values(flight, departure);

-- 此处把表已删除的外键再添加上来
alter table `reservation` add foreign key(`Matrikelnummer`) references `customer` (`Matrikelnummer`) on delete cascade on update cascade;
alter table `reservation` add foreign key(`FlightNo`, `DepartureDateAndTimeUTC`) references `flightexecution` (`FlightNo`, `DepartureDateAndTimeUTC`) on delete cascade on update cascade;


else --如果预定不成功则设置为0
SET success = 0;
END CASE;

END



我不知道问题在哪里,程序运行可以通过。但是输入数值,表reservation刷新之后没看到有新的值添加进去。
比如用下面的值实验
call booking ('16579436', 'LH1973', '2014-12-31 11:30:46', '5', @success);
select @sucess;

此外,我尝试单独把外键去掉,结果显示不让去掉。不让去掉也能加新行吗?我尝试在表customer加入matrikelnummer,在 flightexecution里面加入(`FlightNo`, `DepartureDateAndTimeUTC`) 也加不进去,因为他们各自又和其他表连着。

求助
...全文
312 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LB4229 2014-07-15
  • 打赏
  • 举报
回复
LB4229 2014-07-15
  • 打赏
  • 举报
回复
LB4229 2014-07-15
  • 打赏
  • 举报
回复

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧