问题描述:
一张表,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;
建一个唯一索引:
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;
就可以了
可以用存储过程,代码如下:
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存储过程即可。
代码不算复杂,就不加注释了。
感觉这种场景似乎很适合使用触发器啊
我们公司要求禁止使用触发器
这种场景下
建议查询之后再进行后续的操作,便于后期解耦
如果是大批量的数据,默认存在即更新,则使用insert if not exist
不同数据库支持的语句不一样
甚至需要使用存储过程
先根据这条数据去查啊 ,如果有就更新,没有就新增。。。。。。