2017-09-22 77 views
0

我有一个想要插入到表中的数据数组。该表有一个唯一的密钥code,如果一个记录已经存在与该密钥,我想更新该记录,而不是。我想,这可能是与INSERT INTO ON DUPLICATE KEY UPDATE声明将数据列表提供给“ON DUPLICATE KEY UPDATE”

INSERT INTO codes (code, delta) 
VALUES ... 
ON DUPLICATE KEY UPDATE 
delta=new_delta 

上述语法的问题是,new_delta是阵列中的每个小区的不同属性来实现。是否可以使用此语法提供每个new_delta的列表,并为每个code选择相关的new_delta?还是有另一种方法应该接近这个问题?

+0

什么数组? MySQL没有称为“数组”的数据类型。 –

回答

0

你可以但它会变得非常复杂,除非我误解了。

这是正常的形式:

INSERT INTO codes (code, delta) 
    VALUES (code1, delta1), 
      (code2, delta2), 
      .... 
ON DUPLICATE KEY UPDATE 
    delta = VALUES(delta) 

在此,如果两个代码1和代码2存在时,首先会被更新以DELTA1,并且所述第二到DELTA2的值;因为这些是名为delta的列的VALUES()

但在我看来,你想有一个不同的三角洲?因此,您在数据库中有(code1,delta1),您插入(code1,delta2),并且如果code1已经存在,delta值应该设置为delta3?

在这种情况下,你可以这样做:

ON DUPLICATE KEY UPDATE 
    delta = CASE code 
     WHEN code1 THEN delta3 
     WHEN code2 THEN delta5 
     ... 
     END 

或者你也可以添加新列到数据库,dupdelta,与同类型的三角洲。现在你插入这个元组:

(code3, delta3, delta4) 

含义:如果code3不存在,你想要将其delta设置为delta3。但是如果它已经存在,你希望它的增量变成delta4。

你只需指定

ON DUPLICATE KEY UPDATE delta=VALUES(dupdelta) 

当然现在的表有一个名为dupdelta多余无用列。您可能想要创建一个VIEW来隐藏它。

+0

啊,谢谢。我没有意识到,语句的INSERT部分创建了一列代码和增量,并且这些列可以被引用。我在想,声明中的“INSERT”和“UPDATE”部分是相互独立的。 – Zach

相关问题