MySQL插入数据前检测唯一性的一些语句用法总结



在写程序的时候经常碰到在向数据库中插入数据时,判断数据是否已存在。诸如有存在的数据时跳过,不存在的数据继续插入,要避免重复插入,又不想折腾两回数据库连接操作,这里可能会用到以下语句,现小结一下。

INSERT IGNORE INTO

IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,此种方法效率比较高,判断是否存在,存在会丢弃掉这行数据,不做任何插入,否则插入。当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。这样不用校验是否存在了,有则忽略,无则添加。例如:

 
 
  1. INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')

ON DUPLICATE KEY UPDATE

当primary或者unique重复时,则执行UPDATE语句,如UPDATE后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。例如,为了实现重复的数据插入不报错,可使用一下语句:

 
 
  1. INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDAT cut = cut +1

如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。如果列b也是唯一列,则INSERT与此UPDATE语句相当。

您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。例如:

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

INSERT … SELECT … WHERE NOT EXISTS

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

 
 
  1. INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

REPLACE INTO

需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样。(此种方法是利用替换的方法,有点似类于先删除再插入。如果存在primary or unique相同的记录,则先删除掉。再插入新记录。

 
 
  1. REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。

注:REPLACE发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。

说在最后:很多情况下建立表唯一索引,能给我们省下很多麻烦事,想上面说的REPLACE INTO就必须是有唯一索引,当然,很多人喜欢用到的自增主键ID尽管也是唯一索引,我建议是能在其他经常出现在where条件屁股后面的字段,并且值是唯一的话可以加个索引甚至唯一索引,查询速度将会提高很多。

大家要根据自己的需求来确定,不一定就适合你现在的需求;我只是提示大家还有这么些个实用的小知识大家可以灵活运用到项目里边。

在设计MySQL结构以保证数据唯一性的同时优化并发插入效率,关键在于合理利用`UNIQUE`约束和`INSERT IGNORE`语句。首先,在设计结构时,应当为需要保证唯一性的字段添加`UNIQUE`约束。例如,若需确保用户的电子邮件地址不重复,可以在创建用户添加如下约束: 参考资源链接:[优化:MySQL避免插入重复数据的方法](https://wenku.csdn.net/doc/6412b764be7fbd1778d4a23d?spm=1055.2569.3001.10343) ```sql CREATE TABLE user ( user_id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL, UNIQUE(email) ); ``` 这样,`email`字段就会自动检查重复值,并在插入时禁止重复的电子邮件地址。 其次,在进行数据插入操作时,使用`INSERT IGNORE`语句可以有效避免因重复数据插入导致的错误,并保持插入操作的原子性。例如,当尝试插入新用户记录时,可以使用如下SQL语句: ```sql INSERT IGNORE INTO user (email) VALUES ('***'); ``` 这条语句会检查`email`字段是否违反了唯一性约束,如果存在重复值,则这条插入语句会被忽略,不会执行,也不会返回错误;如果不存在重复值,则数据会被正常插入中。 为了进一步提升并发环境下的数据插入效率,可以考虑使用`INSERT ... ON DUPLICATE KEY UPDATE`语句,这个语句在遇到重复的唯一键值时,会执行一个更新操作,而不是简单的忽略。例如: ```sql INSERT INTO user (email) VALUES ('***') ON DUPLICATE KEY UPDATE email=email; ``` 这条语句插入数据时,如果发现`email`字段的值违反了唯一性约束,就会将该字段更新为相同的值,实际上并没有改变任何数据,但这样做可以避免重复键值导致的错误,并且通常来说比`INSERT IGNORE`更快。 通过上述设计和SQL语句的合理运用,我们可以在保证数据唯一性的同时,有效提升并发插入操作的效率。 参考资源链接:[优化:MySQL避免插入重复数据的方法](https://wenku.csdn.net/doc/6412b764be7fbd1778d4a23d?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值