请教关于MySQL新增数据,不存在则新增,存在则更新的问题 10C

问题描述:
一张表,id为主键,现在在数据库中插入数据,如果存在firstName、lastName相同的数据,则更新count,不存在这插入数据。
例如:已有数据中,已存在 firstName 为 Jack,lastName 为 Li 的数据,则原有数据不新增,只修改count。
我尝试过使用ON DUPLICATE KEY UPDATE函数,但是我发现这个函数貌似只能根据插入的数据中第一个字段做判断。
请高手们多多指点。

##建表

CREATE TABLE test (
id int(11) NOT NULL AUTO_INCREMENT,
firstName varchar(20) DEFAULT NULL,
lasetName varchar(20) DEFAULT NULL,
job varchar(255) DEFAULT NULL,
phone varchar(255) DEFAULT NULL,
count int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


插入数据:

INSERT INTO test (id, firstName, lasetName, job, phone, count) VALUES ('1', 'Jack', 'Chen', '演员', '110', 100);
INSERT INTO test (id, firstName, lasetName, job, phone, count) VALUES ('2', 'Jack', 'Li', '演员', '110', 200);


##删除表:

DROP TABLE test;


6个回答

可以用存储过程,代码如下:

CREATE DEFINER=`root`@`localhost` PROCEDURE `insertRecord`()
BEGIN
    IF EXISTS (SELECT * FROM test WHERE firstName='Jack' and lasetName='Li') THEN
        UPDATE test SET count=count+1  WHERE firstName='Jack' and lasetName='Li';
    ELSE 
          INSERT INTO test (id, firstName, lasetName, job, phone, count) VALUES ('1', 'Jack', 'Chen', '演员', '110', 100);
    END IF;

END

然后调用执行insertRecord存储过程即可。
代码不算复杂,就不加注释了。

fight_in_dl
战在春秋 存储过程类似于函数,你要是用Mysql Workbench,运行存储过程很简单,点一个按钮就行。
2 年多之前 回复
qq_33203818
沧海十一刀 其实我这就是普通的插入数据,如果专门写个存储过程,有点杀鸡用牛刀啊。。还是谢谢啊
2 年多之前 回复

围观,我们开发中都是先查询一下有没有这条数据,然后再做操作图片说明

建一个唯一索引:

 ALTER TABLE `test`.`test` 

DROP INDEX  

, ADD UNIQUE INDEX `UQ_NAME` (`firstName` ASC, `lasetName` ASC) ;

这时候再执行:

 INSERT INTO test (id, firstName, lasetName, job, phone, count) 
VALUES ('3', 'Jack', 'Li', '演员', '110', 200)
ON DUPLICATE KEY UPDATE count=count+1; 

就可以了

qq_33203818
沧海十一刀 谢谢哈,但是不能这样建索引,因为还有另外的数据,需要验证另外两个字段,总不能建4个索引吧。。。
2 年多之前 回复

感觉这种场景似乎很适合使用触发器啊

我们公司要求禁止使用触发器
这种场景下
建议查询之后再进行后续的操作,便于后期解耦

如果是大批量的数据,默认存在即更新,则使用insert if not exist
不同数据库支持的语句不一样
甚至需要使用存储过程

先根据这条数据去查啊 ,如果有就更新,没有就新增。。。。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!