You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HMS酒店管理系统:MySQL多表插入及总计列添加问题求助

酒店管理系统多表数据整合至Total表的Python解决方案

问题背景

开发酒店管理系统(HMS),使用MySQL数据库,包含c_details、fashion、gaming、restaurant、room_rent及total表,其中total表创建语句:

CREATE TABLE IF NOT EXISTS TOTAL(CID VARCHAR(20) primary key,ROOMRENT INT ,RESTAURANTBILL INT ,GAMINGBILL INT, FASHIONBILL INT)

需求:根据用户输入的CID(所有表均含该字段),从多表提取对应账单数据插入total表,同时为total表添加grandtotal列计算账单总和。

当前遇到错误:mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column 'c101' in 'where clause'

错误原因

这个错误是因为直接将CID值拼接进SQL语句时未加引号,比如输入c101后,生成的SQL是WHERE CID = c101,MySQL会把c101识别为列名而非字符串值,导致找不到对应列。解决核心是使用参数化查询,而非字符串拼接。

正确代码方案

步骤1:为total表添加grandtotal列

如果还未添加,先执行以下SQL(可在Python中执行,或直接在MySQL客户端运行):

ALTER TABLE TOTAL ADD COLUMN GRANDTOTAL INT;

步骤2:Python实现代码

import mysql.connector
from mysql.connector import Error

def sync_total_bill(cid):
    try:
        # 建立数据库连接
        conn = mysql.connector.connect(
            host='localhost',
            database='你的数据库名称',
            user='你的数据库用户名',
            password='你的数据库密码'
        )

        if conn.is_connected():
            cursor = conn.cursor()

            # 从多表查询账单数据,用COALESCE处理无消费的情况(返回0)
            query = """
                SELECT 
                    COALESCE(rr.ROOMRENT, 0),
                    COALESCE(rb.RESTAURANTBILL, 0),
                    COALESCE(gm.GAMINGBILL, 0),
                    COALESCE(fs.FASHIONBILL, 0)
                FROM c_details cd
                LEFT JOIN room_rent rr ON cd.CID = rr.CID
                LEFT JOIN restaurant rb ON cd.CID = rb.CID
                LEFT JOIN gaming gm ON cd.CID = gm.CID
                LEFT JOIN fashion fs ON cd.CID = fs.CID
                WHERE cd.CID = %s
            """
            cursor.execute(query, (cid,))
            bill_data = cursor.fetchone()

            if bill_data:
                room_rent, restaurant_bill, gaming_bill, fashion_bill = bill_data
                grand_total = room_rent + restaurant_bill + gaming_bill + fashion_bill

                # 插入或更新total表(REPLACE INTO覆盖已有数据,不存在则插入)
                insert_sql = """
                    REPLACE INTO TOTAL (CID, ROOMRENT, RESTAURANTBILL, GAMINGBILL, FASHIONBILL, GRANDTOTAL)
                    VALUES (%s, %s, %s, %s, %s, %s)
                """
                cursor.execute(insert_sql, (cid, room_rent, restaurant_bill, gaming_bill, fashion_bill, grand_total))
                conn.commit()
                print(f"CID {cid} 的账单已同步到total表")
            else:
                print(f"未找到CID为 {cid} 的客户记录")

    except Error as e:
        print(f"数据库操作出错: {e}")
    finally:
        # 关闭数据库连接
        if conn.is_connected():
            cursor.close()
            conn.close()

# 接收用户输入并执行同步
target_cid = input("请输入要同步的客户CID: ")
sync_total_bill(target_cid)

关键注意点

  • 参数化查询:用%s作为占位符,将CID值通过元组传入cursor.execute(),既避免SQL注入,也解决了字符串值的引号问题。
  • LEFT JOIN + COALESCE:确保客户某类服务无消费时返回0而非NULL,避免总和计算出错。
  • REPLACE INTO:自动处理CID已存在的情况,直接覆盖旧数据;不存在则插入新数据,适配账单更新场景。

内容的提问来源于stack exchange,提问作者Xtremez Gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:15:36