mysql 插入数据如何防止重复

mysql 插入数据如何防止重复,第1张

如果表中包含有一个自动递增字段AUTO_INCREMENT,并用 INSERT ... UPDATE 插入一行,函数 LAST_INSERT_ID()会返回AUTO_INCREMENT的值,如果这个语句更新某一行, LAST_INSERT_ID() 就没有意义了。但是,你可以通过用 LAST_INSERT_ID(expr)使它变得有意义,假如id字段是自动递增栏的话,使 LAST_INSERT_ID() 对更新语句有意义的方法如下:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3

ON DUPLICATE KEY UPDATE命令语句,那么在唯一索引或者主索引的作用下将不插入与数据库教程记录重复的内容,但同时会更新数据库中的旧记录。例如,字段a被声明为唯一索引并且里面只包含有值为1的记录,以下两个语句会达到同样的效果:一、INSERT INTO table (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE c=c+1二、UPDATE table SET c=c+1 WHERE a=1可以在插入更新语句 INSERT ... UPDATE 中使用 VALUES(字段名) 函数去关联某一行记录。也就是说, VALUES(字段名) 可以用在UPDATE语句中去更新某字段的值而不会出现重复键。这个函数在多行插入中尤其有用。但是函数 VALUES() 仅当用在 INSERT ... UPDATE 语句中才有意义,否则会返回NULL。例如:INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b)

其它方法insert into songinfo(songname,songtime,songpath) select 'aaa','bb' ,'cc' from dual where not exists(select * from songinfo where songname='123')//上述命令在MYSQL3.x版本上不能执行,5.0.24的可以

比如我的Mysql当中某database存在url这张表,现在要有C API 将url,url_hash,domain这三个变量的值插入到数据库中,url_hash是主键,本来为了不至插入重复项,应该判断一下的,现在只要这一条SQL语句就行了,什么都不要管,减少了大量的查询和判断工作,我只能说一句:太爽了。如下:SQL语句:

insert into TABLE(FIELD0,FIELD1...) select VALUE0,VALUE1 ,... from dual where not exists(select * from TABLE where FIELDN=VALUEN)代码:

int store_url(char *url)

{

char *key, url_hash[HASHLEN], domain[DOMAINLEN], sqlstr[SQLSTRLEN]......sprintf (sqlstr, "insert into url(url,url_hash,domain) select '%s','%s','%s' from dual where not exists(select * from url where url_hash='%s') ", url, url_hash, domain, url_hash)

if (mysql_query (conn, sqlstr)) //大部分情况下失败是由于数据库关闭,所以可以在以下添加上再连接MySQL的代码,不赘写!

{ printf ("Error:%sn", mysql_error (conn))

return

}

}最后有一种比较简单的方法就是先查询当前的数据在数据库是否有相同的,如果有的话就提示如

*/

$title ='www.111cn.net'

$sql = "Select * from tablename where title='$title'"

$query = mysql_query( $sql )

if( mysql_num_rows( $query ) )

{

exit('不能重复插入相同的记录')

}

else

{

$sql ="insert tablename values('$title')"

mysql_query( $sql )

exit('保存记录成功')

}

//这种方的不好之处在于多次查询了数据库,并且代码也冗余了,好了到底你用那排除重复数据的方法你自己根据自己的情况而定吧。

这么大的表优化是很痛苦的,看你对数据的用途,如果不经常查询、而是频繁的增加,可以考虑定期(每周或者每日)把表中的数据复制到历史表中,清空工作表的数据,这样插入的效率能大大提高,但是查询的时候需要在两个表中进行查询。用于频繁插入数据的工作表要尽量少建索引,用于查询的历史表要多建索引。

MySQL 5.7.17 以后提供了Connection-Control插件用来控制客户端在登录 *** 作连续失败一定次数后的响应的延迟。该插件可有效的防止客户端暴力登录的风险(攻击)。该插件包含以下2个组件

CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间

CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:该表将登录失败的 *** 作记录至IS库中

-- 配置文件增加以下配置(按需求)

[mysqld]

plugin-load-add = connection_control.so

connection-control = FORCE

connection-control-failed-login-attempts= FORCE

connection_control_min_connection_delay = 1000

connection_control_max_connection_delay = 86400

connection_control_failed_connections_threshold = 5

-- 插件动态安装启用

-- 验证是否正常安装

-- 查看默认相关变量

+-------------------------------------------------+------------+

| Variable_name | Value |

+-------------------------------------------------+------------+

| connection_control_failed_connections_threshold | 3 |

| connection_control_max_connection_delay | 2147483647 |

| connection_control_min_connection_delay | 1000 |

+-------------------------------------------------+------------+

-- 定制化配置(动态)

-- 查看修改后的配置

+-------------------------------------------------+-------+

| Variable_name | Value |

+-------------------------------------------------+-------+

| connection_control_failed_connections_threshold | 3 |

| connection_control_max_connection_delay | 86400 |

| connection_control_min_connection_delay | 1000 |

+-------------------------------------------------+-------+

connection_control_failed_connections_threshold

失败尝试的次数,默认为3,表示当连接失败3次后启用连接控制,0表示不开启

connection_control_max_connection_delay

响应延迟的最大时间,默认约25天

connection_control_min_connection_delay

响应延迟的最小时间,默认1000微秒,1秒

-- 该表记录登录失败的用户及失败次数,当用户登录成功后,登录失败的记录则会被删除。

-- 重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)

-- 如果使用不存在的用户登录,则该表记录用户名为空,但会记录具体登录的IP

use information_schema

select * from connection_control_failed_login_attempts

-- 连接控制的使用次数(可用户判断是否存在暴力登录尝试)

-- 重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)

+------------------------------------+-------+

| Variable_name | Value |

+------------------------------------+-------+

| Connection_control_delay_generated | 5 |

+------------------------------------+-------+


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7194003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存