如果已存在唯一值,如何更新数据?

时间:2015-01-21 15:56:37

标签: mysql sql sql-update sql-insert insert-into

如果我的表中存在唯一值,如何更新它,如果不存在则添加它?在我的SQL中,OBJECTID是我的主键。我正在比较两个数据表,然后将记录追加到一个表LatestData,其中OctoberExport中的值与SeptExport中的值不匹配。

INSERT INTO LatestData ( OBJECTID, LINING_MATERIAL )
SELECT OctoberExport.OBJECTID, OctoberExport.LINING_MATERIAL
FROM OctoberExport
WHERE (((OctoberExport.OBJECTID) Not In (SELECT SeptExport.OBJECTID FROM SeptExport WHERE OctoberExport.OBJECTID = SeptExport.OBJECTID AND OctoberExport.LINING_MATERIAL = SeptExport.LINING_MATERIAL)));

2 个答案:

答案 0 :(得分:0)

MySQL中有一个名为on duplicate的函数。如果值不存在,您可以告诉您的查询添加值,如果有,请插入它。

  

如果指定ON DUPLICATE KEY UPDATE,则插入一行   会导致UNIQUE索引或PRIMARY KEY中的重复值   执行旧行的更新。

示例(摘自mysql.com):

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

答案 1 :(得分:0)

PRIMARY KEY约束强制执行唯一性。由于表的主键是OBJECTID列,因此无法插入具有相同 OBJECTID值的其他行。

为了在表中有两个具有相同OBJECTID值的行,您需要更改表的PRIMARY KEY以包含一些其他列(或列)以使其唯一。

例如,您可以添加另一列EXPORT_MONTH。来自SeptExport表的行将具有一个值,OctExport表中的行将具有不同的值,因此可以将这两行添加到表中。

ALTER TABLE LatestData ADD EXPORT_MONTH VARCHAR(12) NOT NULL DEFAULT '';

您可以使用UPDATE语句将现有行的值设置为空字符串以外的值。

更改PRIMARY KEY约束可能会有点复杂,尤其是如果您有外键引用。但是你需要最终得到这样的主键约束:

PRIMARY KEY (OBJECTID, EXPORT_MONTH)

(有时候,创建一个新表,然后从现有表中复制行,重命名表就是这样做的改变。)

最终结果是您可以在表格中包含这样的行:

OBJECTID  EXPORT_MONTH  LINING_MATERIAL
--------  ------------  ---------------
   12345  SeptExport    Aluminum
   12345  OctExport     Platinum

(我不清楚你要问的是什么,但鉴于OBJECTID有一个独特的约束,它不可能在{中有两个具有相同值的行{1}}。)