我有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
表
答案 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'
我假设1
是id
,"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具有price
或group
的不同值