mysql - 在 Python 中使用 mysql.connector 执行 MySQL 触发器,该触发器计算值并将其插入到现有表中新创建的列中

标签 mysql python-3.x triggers mysql-connector-python

我正在尝试在Python 3中执行一个游标,该游标将在表中创建一个新列“Total_TU”,并且该列应根据其他两列中的行自动获取每行的值:“CU_per_TU”和“恩”。 “Total_TU”=“CU_per_TU”*“TU”

列“Total_TU”和“TU”是同时创建的,我需要在更新列“TU”后更新列“Total_TU”。

SQL 语法错误出现在最后一个cursor.execute 语句中。

我正在尝试这段代码,我在其他主题和手册中看到过该代码,但是最后一个cursor.execute 命令出现 SQL 语法错误,而且我不明白问题出在哪里。

这是代码

import mysql.connector

conn = connection_forward_db
cursor = conn.cursor()

cursor.execute("CREATE TABLE IF NOT EXISTS AC_forwarders.table_a AS SELECT * FROM `temp`")
cursor.execute("ALTER TABLE AC_forwarders.table_a ADD TU INT, ADD Total_CU INT")
cursor.execute("UPDATE table_a SET TU = "+int(x)+" WHERE Product_ID = aaa")


cursor.execute("""CREATE TRIGGER Total_TU_update BEFORE UPDATE ON table_a
FOR EACH ROW BEGIN
    SET new.Total_TU = new.CU_per_TU * new.TU;
END~

CREATE TRIGGER Total_TU_insert BEFORE INSERT ON table_a
OR EACH ROW BEGIN
    SET new.Total_TU = new.CU_per_TU * new.TU; 
END~""") 

conn.commit()

在用值更新 TU 后,Total_TU 列必须根据 CU_per_TU 和 TU 进行更新。

这是完整的错误(我只运行最后一个光标,其他 3 个光标工作正常):

MySQLInterfaceError Traceback(最近一次调用最后一次) cmd_query 中的/anaconda3/lib/python3.6/site-packages/mysql/connector/connection_cext.py( self ,查询,原始,缓冲,raw_as_string) 第394章 --> 395 raw_as_string = raw_as_string) [第 396 章]

MySQLInterfaceError:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '~

附近使用的正确语法

在表_a上插入之前创建触发器Total_TU_insert 或者每行开始 ' 在第 4 行

在处理上述异常的过程中,又发生了一个异常:

编程错误回溯(最近一次调用最后一次) 在 () 17 或每行开始 18 SET new.Total_TU = new.CU_per_TU * new.TU; ---> 19 结束~""") 20 21 conn.commit()

/anaconda3/lib/python3.6/site-packages/mysql/connector/cursor_cext.py 在执行( self ,操作,参数,多) 第264章 第265章 --> 266 raw_as_string=self._raw_as_string) 267 除了 MySQLInterfaceError 之外: 268 引发错误。get_mysql_exception(msg=exc.msg, errno=exc.errno,

cmd_query 中的

/anaconda3/lib/python3.6/site-packages/mysql/connector/connection_cext.py(self, query, raw, buffered, raw_as_string) 第396章 第397章 --> 398 sqlstate=exc.sqlstate) 399 除了属性错误: 400 如果 self._unix_socket:

编程错误:1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '~

附近使用的正确语法

在表_a上插入之前创建触发器Total_TU_insert 或者每行开始 ' 在第 4 行

最佳答案

非常感谢 P.Salmon!

是的,现在我调整代码后就可以了:

cursor.execute("""CREATE TRIGGER Total_TU_update BEFORE UPDATE ON table_a
FOR EACH ROW
    SET new.Total_TU = new.CU_per_TU * new.TU;""")


cursor.execute("""CREATE TRIGGER Total_TU_insert BEFORE INSERT ON table_a
FOR EACH ROW
    SET new.Total_TU = new.CU_per_TU * new.TU;""") 

conn.commit()

P.S 表中存在其他依赖列,我只是没有提及它们,因为它们没有问题:)

关于mysql - 在 Python 中使用 mysql.connector 执行 MySQL 触发器,该触发器计算值并将其插入到现有表中新创建的列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56965681/

相关文章:

python - 无法使用简写 if/else 初始化/错误更正对象名称

mysql - 使用 mysql 触发器在同一行中复制和粘贴值,这可能吗?

python - 如何根据另一列更改数据框列中的值?

Python PLY 中 if-else 和 while 语句的问题

MySQL 触发器 - 修剪并创建 2 条记录

Postgresql,用触发器维护分层数据

mysql支持 "with"这种sql吗?

mysql - Cakephp 查找 ('list' ) 与汇总数据返回空值

使用GD和MySQL数据的PHP折线图

mysql - Azure Advisor for MySql 建议将 TLS 版本更新到 1.2 - 服务器已在运行 'tls_version: TLSv 1.2'