对于唯一索引,插入重复项,
insert into 会导致错误,
insert ignor into不会,
replace into删除已存在的记录再插入,
on duplicate key update会更新已有记录。
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;//假设a为主键或唯一索引
有些情况下,需要在多台服务器上维护相同结构的数据库,但是里面数据不一样。修改了一边的数据库结构就要去另一边修改,有时经手的人多了也不知道哪边改了什么,哪边没改。做了个数据库结构比较工具,代码比较烂。。。有时间再整理下。。。
只有一个php文件,需要联网获取jquery.js,推荐使用chrome或firefox浏览。
下个版本:
直接生成修改结构的SQL语句。
以前在一家视频网站工作一段时间,在当时属于起步比较早的视频分享网站,尽管访问量不大,但是我们还是研究了大访问量下网站设计的一些问题,可惜网站后来关闭了,很多东西都还没来得及实践。最近又拾起这个话题,便将以前学习到的整理一下。都是些皮毛,欢迎拍砖。
要建设一个大流量网站涉及很多内容,需要Developer,SA,甚至DBA来多人协作,基本上可以分为程序设计和网络架构两个方面。相比较而言网络架构显得更为重要,因为程序性能方面的不足有些可以通过更多的服务器来弥补,但这也不是说程序设计就不重要,好的程序设计可以更有效的使用服务器资源,降低成本。
Continue reading »
经常遇到的一个问题就是如果插入数据存在时,则执行更新语句,通常会先select,有就update,无则insert。
如何简单的完成这个任务呢?
有时候可以用replace into,这时会先删除原来的数据,再插入一条,需要注意的是,插入的数据必须能造成主键或唯一索引冲突,否则不会删除旧数据。
如果在insert into后面指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
mysql> UPDATE table SET c=c+1 WHERE a=1;
如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。
您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。
示例:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本语句与以下两个语句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。
如果需要更新自动增长的字段,可以使用LAST_INSERT_ID函数。
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
php版
function rad($d)
{
return $d * 3.1415926535898 / 180.0;
}
function GetDistance($lat1, $lng1, $lat2, $lng2)
{
$EARTH_RADIUS = 6378.137; //公里
$radLat1 = rad($lat1);
$radLat2 = rad($lat2);
$a = $radLat1 – $radLat2;
$b = rad($lng1) – rad($lng2);
$s = 2 * asin(sqrt(pow(sin($a/2),2) +
cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
$s = $s *$EARTH_RADIUS;
$s = round($s * 10000) / 10000;
return $s;
}
mysql版
CREATE DEFINER=`root`@`localhost` FUNCTION `distance`(lat1 float,lng1 float,lat2 float,lng2 float) RETURNS float
BEGIN
set @num=
2 * 6378.137* ASIN(SQRT(POW(SIN(PI() * (lat1 – lat2) / 360), 2) + COS(PI() * lat1 / 180)
* COS(lat2* PI() / 180) * POW(SIN(PI() * (lng1 – lng2) / 360), 2)));
RETURN @num;
END
前言:
原文地址:5 ways to make hexadecimal identifiers perform better on MySQL,作者是《High Performance MySQL, Second Edition.》的主要作者。这里是原文的节译。
在我们的业务中,经常会用md5()或者uuid()作为作为数据的标识,比如B2C网站,经常会有一些电子优惠券,常用就是通过md5()获得一 个32位字符串,给字符串建立索引,然后用户输入优惠券代码之后系统查出此优惠券对应的折扣率:select discount from coupon where id = ‘0cc175b9c0f1b6a831c399e269779527′,这样的做法存在两个问题:数据和索引很大以及非顺序数据,本文忽略“非顺序数 据”的问题,因为顺序数据和非顺序数据的优劣很大程度上由技术特性决定。这里讲得是如何在使用16进制大数据的情况下保持好的性能,主要讲的是MySQL 数据库,对其他数据库应该也起作用。
Continue reading »


Recent Comments