当密钥不是MySql中的PRIMARY KEY时,如何“在重复ELSE INSERT时更新”

时间:2017-04-17 03:13:59

标签: mysql

我知道我可以使用INSERT ... ON DUPLICATE KEY UPDATE,但如果所涉及的KEY 主键,我怎么能这样做?例如:

CREATE TABLE tablename (
   id INT PRIMARY KEY,
   transId VARCHAR(64),
   pltCode VARCHAR(64),
   val1 VARCHAR(6),
   val2 VARCHAR(6)
);

INSERT INTO tablename VALUES(1,'001','abc','val1','val2');

如果transIdpltCode已存在,我想更新原始记录。否则,否则插入一个新的。 SQL应该是什么样的?

1 个答案:

答案 0 :(得分:1)

您只需首先在这两列上创建UNIQUE索引:

ALTER TABLE `tablename` ADD UNIQUE `unique_index`(`transId`, `pltCode`);

或者更好的是,创建一个新表:

CREATE TABLE tablename (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   transId VARCHAR(64),
   pltCode VARCHAR(64),
   val1 VARCHAR(6),
   val2 VARCHAR(6),
   PRIMARY KEY (id),
   UNIQUE `unique_index`(`transId`, `pltCode`)
 );
  

正在使用字段属性 NOT NULL ,因为我们不希望这样   字段为NULL。因此,如果用户尝试使用NULL创建记录   值,然后MySQL将引发错误。

     

字段属性 AUTO_INCREMENT 告诉MySQL继续添加   id字段的下一个可用编号。因此,您不必每次都手动设置它。

     

关键字 PRIMARY KEY 用于将列定义为主键。您可以   使用以逗号分隔的多个列来定义主键。

     

关键字 UNIQUE 表示两行不能具有相同的索引   值。

参考This sitepoint tutorial on table creation for more info:

然后在插入时收到重复键时执行ON DUPLICATE KEY UPDATE修改其他列:

INSERT INTO tablename (
  transId, pltCode, val1, val2
) values('001','abc','val1','val2') 
ON DUPLICATE KEY UPDATE val1 = new_val1, val2 = new_val2;