2017-08-23 18 views
0

我有2个表格。第一张表包含一些产品,第二张表用于临时数据存储。两个表都有相同的列名。如何在表中存在数据并更新值(如果不使用MariaDB在表中插入数据)?

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') 

这是posible通过sql查询吗?我需要将其实现为一个Python代码。我可以处理的python部分,但是我对sql不太好。

谢谢

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

+0

你正在使用DBMS?你提到MariaDB,但是用mysql和sql server标记了这个。他们都是三种不同的。 –

+0

mariadb和mysql是一样的,我已经更新了标签。我使用mariadb。如果这两者之间有一些区别,我不能说。我对他们不太好。但我用过的看起来是一样的 –

+0

他们不是真的一样,因为MariaDB是MySQL的替代品,但几乎在所有方面它们都是相同的。 :) –

回答

0

看看How to connect Python programs to MariaDB看看如何连接到你的数据库。

之后,您可以从temp_stor中选择与您从products获得的行相同的id行。假设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

+0

感谢您的python答案,它与我的类似,但我想知道是否有可能通过1个MariaDb命令来完成。我知道如何在python中完成它。让我们称之为好奇。 –

+0

通常在使用IODKU时不会指定auto_increment列。相反,省去'id'和'1'。这是因为,如果你知道'id',你可以做'UPDATE'。 –

0

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

添加

UNIQUE(name, quantity, price, group) 

然后

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

小缺点(?):这将(我认为) '燃烧' 的ID。在你的例子中,它将分配4个新值id,但只使用其中的一个。

更新后的译文

不具备上述的指数,而是有这个。 (我假设product的拼写是 “名”?)

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有不同的值会怎么样?

+0

我已经更新了我的问题,也许它会让你明白我想要的。我不是英语母语的人,所以我有时候会用英语解释我想要的东西。 –

+0

你好,我在假期2周,现在我回来了。我测试了你的更新,但尚未完成。你很近,我相信应该有一些变化。你的“公式”是数量的增长,我不想那样。我只想将“1”添加到现有数量。例如,如果我有4瓶可乐,我想更新像这样的数量(4 + 1)。基本上'temp_stor'我用它来销售一些产品,它只是暂时的。销售后我删除它并插入新产品。但我不想有相同的产品两次或更多,只是为了更新产品。谢谢。 –

相关问题