如何使用条件增加列的值?

how do i increment a value of column with condition?

我的 table 看起来像这样

id effect1(int) effect2(int) effect3(int) 
1     0           1               5
2     1           0               0

我有一个函数,return 1to3 int 值表示 effect1、effect2、effect3 和“id”

当我的函数 returning“id”与我数据集中的“id”匹配时,我试图将每个效果的值增加 1,否则会创建新行并增加效果值

例如

如果我的函数returns (1,3) 我的 table 会变成

id effect1(int) effect2(int) effect3(int) 
1     0           1               6
2     1           0               0

如果我的函数 returns (3,3) 我的 table 会变成

id effect1(int) effect2(int) effect3(int) 
1     0           1               6
2     1           0               0
3     0           0               1

我已经使用 python 尝试了以下代码,但失败了。 有人可以帮我吗

i = (1,3) # the returning value from my function
if i[1] == 1:
    sql = "update test set effect1=effect1+1 WHERE id= ({})".format((str(i[0])))
    db.execute_query(myDb, sql)
elif i[1] == 2:
    sql = "update test set effect2=effect2+1 WHERE id= ({})".format((str(i[0])))
    val = (i[0],)
    db.execute_query(myDb, sql )
elif i[1] == 3:
    sql = "update test set effect3=effect3+1 WHERE id= ({})".format((str(i[0])))
    val = (i[0],)
    db.execute_query(myDb, sql )


def execute_query(connection, query):
    cursor = connection.cursor()
    try:
        cursor.execute(query)
        connection.commit()
        print("Query successful")
    except Exception as err:
        print(f"Error: '{err}'")

在您的实施中,您没有检查 id 是否已经存在。

我用 SQL 语句更新了您的代码,该语句执行您提到的 insertion/update-

  • 如果id存在那么只需要增加特定的效果
  • 如果 id 不存在,那么 id 的新行需要 added/inserted 到 test table)

我还将变量i(两个元素的列表)替换为名为ideffect_no的两个变量,以提高代码的可读性。 if else 语句也不需要,因为 effect_no 可以 used/incorporated 到 sql 语句本身。

更新后的代码如下:

id, effect_no = (1,3) # the returning value from your function
sql = f"""INSERT INTO test (id, effect1, effect2, effect3)
VALUES ({id}, 0, 0, 0)
ON DUPLICATE KEY UPDATE effect{effect_no} = effect{effect_no} + 1"""
db.execute_query(myDb, sql)

def execute_query(connection, query):
    cursor = connection.cursor()
    try:
        cursor.execute(query)
        connection.commit()
        print("Query successful")
    except Exception as err:
        print(f"Error: '{err}'")

此外,我在此处找到了 INSERT ... ON DUPLICATE KEY UPDATE SQL 语句 https://chartio.com/resources/tutorials/how-to-insert-if-row-does-not-exist-upsert-in-mysql/#using-insert--on-duplicate-key-update

假设id是table的主键或者定义为唯一的,你可以像这样使用MySql的INSERT ... ON DUPLICATE KEY UPDATE Statement

i = (1, 3)
sql = """
INSERT INTO test (id, effect1, effect2, effect3)
SELECT id, (n = 1), (n = 2), (n = 3) FROM (SELECT ? id, ? n) t
ON DUPLICATE KEY UPDATE effect1 = effect1 + (n = 1), 
                        effect2 = effect2 + (n = 2), 
                        effect3 = effect3 + (n = 3);
"""
db.execute_query(myDb, sql, i)

def execute_query(connection, query, i):
    cursor = connection.cursor()
    try:
        cursor.execute(query, i)
        connection.commit()
        print("Query successful")
    except Exception as err:
        print(f"Error: '{err}'")

在 MySql 中查看 demo 其工作原理。