如果不使用MariaDB在表中插入数据,如何检查表中是否存在数据并更新值?

时间:2017-08-23 18:13:37

标签: python database mariadb

我有2张桌子。第一个表包含一些产品,第二个表用于临时数据存储。两个表都具有相同的列名。

Table `products`: contains this columns
                 - id (unique, autoincrement)
                 - name
                 - quantity
                 - price
                 - group
Table `temp_stor`: contains this columns
                 - id (unique, autoincrement)
                 - name
                 - quantity
                 - price
                 - group

我想从第一个表中获取一行(名称,数量,价格,组),如果数据不存在,则将其插入第二个表中。如果temp_stor中存在相同的数据,我只想更新一列(数量)。

例如: 我从products获取以下行('cola','1','2.5','soda'),我想查看temp_stor以查看该行是否存在。 temp_store表看起来像这样:

('milk 1L','1','1.5','milks')
('cola','1','2.5','soda')
('bread','1','0.9','pastry')
('7up','1','2.8','soda')

我们看到第二行存在,我想更新它的数量。该表将如下所示:

    ('milk 1L','1','1.5','milks')
    ('cola','2','2.5','soda')
    ('bread','1','0.9','pastry')
    ('7up','1','2.8','soda')

如果表格如下:

    ('milk 1L','1','1.5','milks')
    ('bread','1','0.9','pastry')
    ('7up','1','2.8','soda')

我想将该行插入表中。所以它看起来像这样:

('milk 1L','1','1.5','milks')
('bread','1','0.9','pastry')
('7up','1','2.8','soda')
('cola','1','2.5','soda')

这可以通过SQL查询来实现吗?我需要将它实现为python代码。我可以处理的python部分,但我对sql不太好。

谢谢

更新1: 我忘了指出也许最重要的事情,这是我的错。我想检查product表中是否存在name temp_stor。只有名称应该是唯一的。如果产品存在,我不想更新它的quantity值,如果product不存在,我想将其插入temp_stor

2 个答案:

答案 0 :(得分:0)

查看How to connect Python programs to MariaDB,了解如何连接到您的数据库。

之后,您可以从temp_stor中选择与id获得的行相同products的行。让row成为您获得的值的元组。

cursor = mariadb_connection.cursor()
cursor.execute("SELECT * FROM temp_stor WHERE id=%s", (some_id,))

如果此查询的结果不包含任何内容,表示没有这样的行,则可以继续插入,否则,更新该行。

if len(cursor) == 0:
    try:
        cursor.execute("""INSERT INTO temp_stor VALUES (%s,%s,%s,%s,%s)""", row)
    except mariadb.Error as error:
        print("Error: {}".format(error))
else:
    cursor.execute ("""
       UPDATE temp_stor
       SET id=%s, name=%s, quantity=%s, price=%s, group=%s
       WHERE id=%s
       """, (row[0], row[1], row[2], row[3], row[4], row[0]))

<强>更新 仅使用一个查询执行类似的操作:

INSERT INTO temp_stor (id, name, quantity, price, group) VALUES(1, "cola", '2.5', 'soda') ON DUPLICATE KEY UPDATE quantity='2.5'

我假设1id"cola"是名称。如果您希望name是唯一的,那么您应该将其设为密钥,因为此查询目前仅比较密钥,在这种情况下似乎是id

答案 1 :(得分:0)

假设“如果数据不存在”意味着“如果名称+数量+价格+组合的组合”不存在?

添加

UNIQUE(name, quantity, price, group)

然后

INSERT INTO products 
          (name, quantity, price, group)
    SELECT name, quantity, price, group FROM temp_stor;

轻微(?)缺点:这会(我认为)'烧'ids。在您的示例中,它将分配4个id的新值,但只使用其中一个。

更新至提问后

上面没有索引,而是有这个。 (我假设product拼写为“name”??)

UNIQUE(name)

则...

INSERT INTO products 
          (name, quantity, price, group)
    SELECT name, quantity, price, group FROM temp_stor
    ON DUPLICATE KEY   -- this will notice UNIQUE(name)
        UPDATE
            quantity = VALUES(quantity);

在没有UPDATEing所有额外列(数量,价格,组)的情况下使用此构造是不常见的。如果temp_stor具有pricegroup的不同值

,该怎么办?