UPDATE INNER JOIN SELECT语句无法运行,语法是否正确?建表报错求助
我来帮你搞定这个问题哈~首先你的CREATE TABLE语句确实存在语法问题,而且从业务需求来看,原表的主键设计也不太适配后续的汇总逻辑,咱们一步步来调整:
第一步:修正
pc12_status表的创建语法 你原来的语句里把PRIMARY KEY直接写在hobbs_end列后面,虽然单个主键这么写语法上勉强可行,但结合你“每日按tail_no汇总”的需求,单靠hobbs_end作为主键不合理——毕竟同一架飞机(同一tail_no)同一天可能有多个飞行段,hobbs_end完全可能重复。咱们调整建表语句,既保证数据唯一性,又适配后续汇总:
CREATE TABLE pc12_status ( id INT AUTO_INCREMENT PRIMARY KEY, -- 新增自增主键,确保每条飞行记录唯一 hobbs_start DECIMAL(5,2) NOT NULL, hobbs_end DECIMAL(5,2) NOT NULL, tail_no INT(5) NOT NULL, landings INT(5) NOT NULL, engine_cycles INT(5) NOT NULL, flight_date DATE NOT NULL, -- 可选:加唯一约束,防止同一飞机同一天同一起始hobbs的重复记录 UNIQUE KEY unique_flight_segment (tail_no, flight_date, hobbs_start) );
第二步:创建(或调整)
totals汇总表 totals表要存储每个tail_no每日的唯一汇总数据,所以主键设为tail_no + flight_date的复合主键,避免同一飞机同一天出现多条汇总记录:
CREATE TABLE totals ( tail_no INT(5) NOT NULL, flight_date DATE NOT NULL, hobbs_total DECIMAL(6,2) NOT NULL DEFAULT 0.00, -- 汇总飞行时长(hobbs_end - hobbs_start的总和) total_landings INT(5) NOT NULL DEFAULT 0, -- 汇总着陆次数 total_engine_cycles INT(5) NOT NULL DEFAULT 0, -- 汇总发动机循环次数 PRIMARY KEY (tail_no, flight_date) -- 复合主键,确保每日每架飞机仅一条汇总记录 );
第三步:编写自动更新
totals表的SQL 用INSERT ... ON DUPLICATE KEY UPDATE语法,既能新增未存在的日期-飞机组合的汇总数据,也能更新已存在的记录(比如原始表新增飞行数据后重新汇总):
INSERT INTO totals (tail_no, flight_date, hobbs_total, total_landings, total_engine_cycles) SELECT tail_no, flight_date, SUM(hobbs_end - hobbs_start) AS hobbs_total, SUM(landings) AS total_landings, SUM(engine_cycles) AS total_engine_cycles FROM pc12_status GROUP BY tail_no, flight_date -- 按飞机和日期分组计算汇总值 ON DUPLICATE KEY UPDATE -- 如果主键已存在,就更新对应的汇总字段 hobbs_total = VALUES(hobbs_total), total_landings = VALUES(total_landings), total_engine_cycles = VALUES(total_engine_cycles);
补充小提示
- 如果你的数据库是PostgreSQL而非MySQL,把
ON DUPLICATE KEY UPDATE换成ON CONFLICT (tail_no, flight_date) DO UPDATE即可,逻辑完全一致。 - 你可以把这段更新SQL做成定时任务(比如MySQL事件调度器、Linux的crontab),就能实现每日自动执行汇总更新啦。
内容的提问来源于stack exchange,提问作者Rachel5309
相关产品推荐
相关产品推荐

