小编Div*_*ero的帖子

MySQL"好"的方法,如果找不到就插入一行,或者如果找到则更新它

通常,我想在我的一个用户上运行查询,我希望以1对1的关系存储与该用户相关联的行.所以,让我们说(这只是一个任意的例子),我有一个表跟踪用户的汽车,以及一些关于汽车的信息.每个用户可以拥有0或1辆汽车.如果用户没有汽车,则表中没有该用户的条目.

汽车表(再次,只是一个例子):id,user_id,car_make,car_model

所以,当我更新这个表时,我总是会做这样的事情(伪代码):

result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
    UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
    INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能把它变成一个"原子地"起作用的优雅陈述?如果在另一个进程中SELECT和UPDATE语句之间的行被删除,会发生什么?我的UPDATE语句将失败INSERT语句应该运行的地方.我觉得我需要做两个相似(但不同)的陈述来完成同样的事情!我需要的是一些声明,它将向我保证我想要的数据存在于表中,特别是当我只想要一行满足我的要求时.例如,它可能是这样的(当然这是完全构成的):

MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
Run Code Online (Sandbox Code Playgroud)

这样,如果user_id已经存在,那么它将被更新,否则将被插入.此外,如果我更改了要求,例如说每个用户可以拥有给定car_make的零个或一个汽车,那么我可以进一步指定:

MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
Run Code Online (Sandbox Code Playgroud)

我希望我的问题有道理!如何改进这种经常出现的基本insert-if-not-found或update-if-found操作?谢谢你的帮助!

mysql database-design upsert

16
推荐指数
3
解决办法
2万
查看次数

仅在找不到文件时才重定向请求?

我希望有一种方法可以用mod_rewrite和Apache做到这一点,但也许还有另一种方法可以考虑.

在我的网站上,我为客户端设置了重新设置的网站版本目录.如果是Web根目录/home/blah/www,那么客户端目录就是/home/blah/www/clients/abc.当您通过Web浏览器访问客户端目录时,我希望它在客户端目录中使用任何请求的文件(如果存在).否则,我希望它使用Web根目录中的文件.

例如,假设客户端不需要自己的客户端index.html.因此,一些代码将确定没有index.htmlin /home/blah/www/clients/abc并将改为使用/home/blah/www.请记住,我不想随时将客户端重定向到Web根目录,如果客户端目录没有指定自己的副本,我只想使用具有该名称的Web根目录.Web浏览器仍应指向/clients/abc该文件是存在还是存在于根目录中.同样,如果news.html客户端目录存在请求并且它确实存在,那么只需提供该文件而不是Web根目录news.html.用户的体验应该是无缝的.

我需要这个来处理任何文件名的请求.例如,如果我需要为.htaccess我可能想要重定向的每个文件添加一个新行,它就会失去目的,因为需要太多的维护,并且在给定大量文件的情况下很有可能出错.

在您的示例中,请指明您的代码是否位于客户端目录中的.htaccess文件或Web根目录中.Web root是首选.

apache .htaccess mod-rewrite

15
推荐指数
4
解决办法
5万
查看次数

Java:如何从静态上下文中获取当前类的类对象?

我有一个日志功能,它将调用对象作为参数.然后我调用getClass().getSimpleName(),以便我可以轻松获取要添加到我的日志条目的类名,以便于参考.问题是,当我从静态方法调用我的日志函数时,我无法传入"this".我的日志功能看起来像这样:

public static void log(Object o, String msg){
  do_log(o.getClass().getSimpleName()+" "+msg);
}
public void do_something(){
  log(this, "Some message");
}
Run Code Online (Sandbox Code Playgroud)

但是,假设我想从静态函数登录:

public static void do_something_static(){
  log(this, "Some message from static");
}
Run Code Online (Sandbox Code Playgroud)

显然do_something_static()不起作用,因为它是静态的,而"this"不在静态上下文中.我怎么能绕过这个?我是否可以在不使用反射的情况下完成它(因为我知道有很多开销涉及并且它可能会影响性能,因为我记录了很多数据)

我知道我可能会以某种方式将当前类硬编码到调用中,但我确信当我将函数移动到另一个类时,我将忘记更新硬编码引用,它将不再正确.

谢谢!

java reflection logging

11
推荐指数
2
解决办法
4万
查看次数

System.currentTimeMillis()和Date getTime()之间的区别?

我希望通过对返回时间戳的函数的多次调用来获得微小的性能提升.该函数如下所示:

public static long get_now_ms(){
    // returns number of MILLISECONDS since epoch
    java.util.Date d = new java.util.Date();
    return d.getTime();
}
Run Code Online (Sandbox Code Playgroud)

我可以用以下内容替换它:

public static long get_now_ms(){
    // returns number of MILLISECONDS since epoch
    return System.currentTimeMillis();
}
Run Code Online (Sandbox Code Playgroud)

我知道Date内部使用System.currentTimeMillis().我的问题是,夏令时或时区是否会导致这两种方法的结果出现差异.我想这可能会出现Calendar对象,但不会出现Date对象,但是会对此有所了解.

我知道我可能不会在实际应用程序中看到明显的性能差异,但仍然想知道答案.

谢谢!

java

11
推荐指数
2
解决办法
1万
查看次数

MySQL MAX()函数用于比较更新中的数值?

更新行时,我希望有一个内置的检查来进行一些边界检查.大多数语言都有一个MAX()函数来返回传递的参数的最大值,但MySQL似乎使用MAX()来做其他事情.例如:

UPDATE person SET dollars = MAX(0, dollars-20) WHERE id=1
Run Code Online (Sandbox Code Playgroud)

我想从人id 1减去20美元,但我不希望美元永远用负值表示,所以我希望与0进行内置比较.这有用吗?或者还有另一种方式吗?谢谢!

mysql sql

9
推荐指数
1
解决办法
1万
查看次数

订单按字段等于特定值?

假设我有这个MySQL查询:

SELECT * FROM A WHERE x='abc' OR y=0;
Run Code Online (Sandbox Code Playgroud)

如何确定行的优先级,以便在x='abc'哪些情况下订购FIRST?如果y=0但是x!='abc',我希望那些行来自案例之后x='abc'.

这可以通过简单的ORDER BY子句来完成吗?

谢谢!

mysql sql

9
推荐指数
1
解决办法
5524
查看次数

原子地将一个MySQL表复制到另一个表上?

我试图将一个表复制到另一个表"原子地".基本上我想定期更新表,这样如果另一个进程正在更新表,从表中读取的进程将不会得到不完整的结果.

为了给出一些背景信息,我想要一个充当游戏排行榜的桌子.该排行榜将通过单独的流程每隔几分钟更新一次.我的想法如下:

表SCORES包含可在公众可见的排行榜,当用户查看排行榜时将从该排行榜中读取.此表每隔几分钟更新一次.更新排行榜的过程将创建包含新排行榜的SCORES_TEMP表.创建该表后,我想将其所有内容"原子地"复制到SCORES.我想我想做的是:

TRUNCATE TABLE SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
Run Code Online (Sandbox Code Playgroud)

我想替换SCORES中的所有内容.我不需要维护主键或自动增量值.我只是想从SCORES_TEMP中获取所有数据.但我知道,如果有人在完成这两个陈述之前查看了分数,那么排行榜将是空白的.我怎样才能原子地做到这一点,以至于它永远不会显示空白或不完整的数据?谢谢!

mysql

8
推荐指数
1
解决办法
1849
查看次数

Java:可能有相互的最终类引用吗?

假设我有两个名为A和B的类,它们彼此相关联,这样如果每个类的对象包含对另一个类的引用,则最方便.换句话说,类A具有类B的变量"b".类B具有类A的变量"a".这样,每个类中的代码可以容易地访问另一个类.

有没有办法将这种关联设置为"最终"?即A类中的变量b是最终的,B类中的变量a是最终的?似乎在构造函数中设置这些引用(如final关键字所要求的那样)需要一个不合逻辑的循环引用.

这更像是一个概念问题,而不是一个实际问题.谢谢!

java final class

7
推荐指数
2
解决办法
1222
查看次数

暂时在MySQL*中存储明文密码是否安全*?

一点点背景 -

我运行一个用Java运行的游戏服务器,以及一个用PHP运行的论坛(phpbb).我将游戏和论坛帐户关联起来,这样更改游戏中的密码会自动更改论坛帐户的密码.这两个系统使用不同的密码哈希算法,我需要使用phpbb的内置函数更新论坛端的密码哈希,这意味着我必须从PHP脚本调用它们(而不是运行我自己的代码).

为了做到这一点,我决定让Java调用PHP脚本,只要需要更改密码就向PHP脚本发出HTTP请求,以触发完成论坛帐户密码更改过程的PHP脚本.但是,我不想将明文密码放在任何HTTP调用中,因为它可能会显示在日志文件中,也可能显示在其他可利用区域中.我目前的想法是,当Java端更改密码时,它会将新的明文密码放入数据库表中,然后发出HTTP请求以触发PHP脚本,这样就不会有任何哈希值或敏感信息进入HTTP请求.HTTP调用只传递要更改的帐户的用户名,以及共享密钥的md5哈希加上用户名,以进行身份​​验证.当PHP脚本运行时

在典型条件下,明文密码在删除之前可能在数据库中不到一秒钟.理想情况下,我根本不会将它存储在任何地方,但是当我无法预测论坛的密码哈希是什么时,我不确定如何将所需的更改从Java传递到PHP,所以我需要以某种方式发送执行散列的PHP脚本的明文密码.

有关更好的方法的任何想法,或有关于在很短的时间内存储明文密码的任何反馈?我认为MySQL登录是安全的,不与其他人或项目共享.

谢谢!

php java mysql security phpbb3

7
推荐指数
1
解决办法
379
查看次数

获取表中没有NULL作为其默认值的所有列名列表?

如何获取表中没有NULL作为其默认值的所有列名列表?

如果我执行"从表名中显示列",我会看到结果中有一列名为"默认".我希望我的语句只返回那些没有NULL作为默认值的列.我已经尝试过使用WHERE子句,但我觉得它很呛,因为"Default"是一个保留字.

谢谢你的帮助!

mysql

6
推荐指数
1
解决办法
1万
查看次数