期末课设是做一个快递业务管理系统。但是在设置触发器的时候出现了问题。
首先我有一个运单表(waybill),各项数据对应如下
CREATE TABLE Waybill(
W_ID INT NOT NULL AUTO_INCREMENT,-- 运单ID
W_name VARCHAR(8),-- 收件人姓名
W_phone VARCHAR(11),-- 收件人联系方式
W_state VARCHAR(8),-- 包裹状态,默认是待发
SD_name VARCHAR(8),-- 起始仓库name
ED_name VARCHAR(8),-- 目的仓库name
W_time DATE,-- 下单日期
W_weight DECIMAL(6,2),-- 重量
W_cost DECIMAL(6,2),-- 运费=重量*2
C_ID INT,-- 发件人ID
C_name VARCHAR(8),-- 发件人姓名
E_ID INT,-- 配送员工ID
E_name VARCHAR(8),-- 配送人员姓名
PRIMARY KEY (W_ID,W_name,W_phone,W_state,SD_name,ED_name),
FOREIGN KEY (C_ID,C_name) REFERENCES Consigner(C_ID,C_name) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (E_ID,E_name) REFERENCES Employee(E_ID,E_name) ON UPDATE CASCADE ON DELETE CASCADE
);-- 运单信息
包裹表(parcel)
CREATE TABLE Depot(
D_name VARCHAR(8),-- 仓库地名
W_ID INT,-- 运单ID
W_name VARCHAR(8),-- 收件人姓名
W_phone VARCHAR(11),-- 收件人联系方式
W_state VARCHAR(8),-- 包裹状态
FOREIGN KEY (W_ID,W_name,W_phone,W_state) REFERENCES waybill(W_ID,W_name,W_phone,W_state) ON UPDATE CASCADE ON DELETE CASCADE
);-- 仓库信息
仓库表(depot)
CREATE TABLE Parcel(
P_ID INT NOT NULL AUTO_INCREMENT,-- 包裹ID
W_ID INT,-- 运单ID
W_name VARCHAR(8),-- 收件人姓名
W_phone VARCHAR(11),-- 收件人联系方式
W_state VARCHAR(8),-- 包裹状态
SD_name VARCHAR(8),-- 起始地
ED_name VARCHAR(8),-- 目的地
C_ID INT,-- 发件人ID
E_ID INT,-- 发件人姓名
PRIMARY KEY (P_ID),
FOREIGN KEY (W_ID,W_name,W_phone,W_state,SD_name,ED_name) REFERENCES waybill (W_ID,W_name,W_phone,W_state,SD_name,ED_name) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (C_ID) REFERENCES Consigner(C_ID) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (E_ID) REFERENCES Employee(E_ID) ON UPDATE CASCADE ON DELETE CASCADE
);-- 包裹信息
除此之外还有员工表和发件人客户表。
CREATE TABLE Employee(
E_ID INT,
E_name VARCHAR(8),
E_gender VARCHAR(2),
E_phone VARCHAR(11),
PRIMARY KEY (E_ID,E_name)
);-- 员工信息
CREATE TABLE Consigner(
C_ID INT,
C_name VARCHAR(8),
C_phone VARCHAR(11),
E_ID INT,
PRIMARY KEY (C_ID,C_name),
FOREIGN KEY (E_ID) REFERENCES Employee(E_ID) ON UPDATE CASCADE ON DELETE CASCADE
);-- 发货客户
触发器主要涉及到前3个表。
数据库中有2个触发器。如下。
这个触发器是正常的!!!
-- 当新运单增加时,增加新包裹到仓库和包裹信息中
DELIMITER $$
CREATE TRIGGER W_add_depot_parcel
AFTER INSERT ON waybill FOR EACH ROW
BEGIN
INSERT INTO depot VALUES (new.SD_name,new.W_ID,new.W_name,new.W_phone,new.W_state);
INSERT INTO parcel(W_ID,W_name,W_phone,W_state,SD_name,ED_name,C_ID,E_ID)
VALUES (new.W_ID,new.W_name,new.W_phone,new.W_state,new.SD_name,new.ED_name,new.C_ID,new.E_ID);
END;
$$
DELIMITER
这个触发器就乐了。
在我的电脑上正常,但是在我舍友的电脑上不对!
-- 当运单的包裹状态变为未到时,删除仓库里的包裹信息
-- 当运单的包裹状态变为取出时,删除仓库,包裹里的包裹信息
-- 当运单的包裹状态变为已达时,增加目的仓库里的包裹信息
DELIMITER $$
CREATE TRIGGER update_all
AFTER UPDATE ON waybill FOR EACH ROW
BEGIN
DELETE FROM depot WHERE depot.W_state = '未到' OR depot.W_state = '取出';
DELETE FROM parcel WHERE parcel.W_state = '取出';
INSERT INTO depot SELECT new.ED_name,new.W_ID,new.W_name,new.W_phone,new.W_state WHERE new.W_state = '已达';
END;
$$
DELIMITER
具体来说,问题如下:
1,第三条语句,也就是INSERT语句在我舍友的电脑里需要在SELECT之后加上FROM语句再到WHERE才可以运行。
2,暂且不考虑第三条语句的功能,语句1和语句2在我这边只是正常的删除那一行的信息,但是在我舍友的电脑上却会把对应的仓库表和包裹表的全部内容删掉!!!
3,除此之外,其余数据库代码完全相同
4,个人问题,过多的主键会不会有什么影响
秋梨膏,真的不知道为什么。
贴一个用到的数据
INSERT INTO employee VALUES(0001,'张三','男','19900001111');
INSERT INTO employee VALUES(0002,'李四','男','19900002222');
INSERT INTO employee VALUES(0003,'王五','男','19900003333');
INSERT INTO employee VALUES(0004,'刘六','女','19900004444');
INSERT INTO consigner VALUES(0001,'龙七','16600001111',0001);
INSERT INTO consigner VALUES(0002,'黄八','16600002222',0001);
INSERT INTO consigner VALUES(0003,'陶九','16600003333',0001);
INSERT INTO waybill VALUES(00001,'周十','18300001111','待发','安徽','北京','2023-6-18',1.34,2.68,0001,'龙七',0003,'王五');
INSERT INTO waybill VALUES(00002,'盛十一','18300002222','未到','上海','安徽','2023-6-18',2.53,5.06,0003,'陶九',0004,'刘六');
INSERT INTO waybill VALUES(00003,'闵十二','18300003333','已达','黑龙江','天津','2023-6-18',1.87,3.74,0002,'黄八',0002,'李四');
-- INSERT INTO waybill VALUES(00004,'盛十一','18300002222','待发','黑龙江','安徽','2023-6-19',2.45,4.90,0002,'黄八',0002,'李四');
-- 如果使用了触发器,那下面的数据应该不用添加
INSERT INTO depot VALUES('安徽',00001,'周十','18300001111','待发');
INSERT INTO depot VALUES('天津',00003,'闵十二','18300003333','已达');
INSERT INTO parcel VALUES(1,00001,'周十','18300001111','待发','安徽','北京',0001,0003);
INSERT INTO parcel VALUES(2,00002,'盛十一','18300002222','未到','上海','安徽',0003,0004);
INSERT INTO parcel VALUES(3,00003,'闵十二','18300003333','已达','黑龙江','天津',0002,0002);