繁体   English   中英

MySQL根据条件选择或插入

[英]MySQL to select or insert based on condition

如何在单个MySQL查询中执行此操作:

if (select count(*)..)=10
  select a record from the same table
else
  insert a record into the same table

只要涉及一个网络服务器,我就会尝试APC http://php.net/manual/de/book.apc.php和一些不错的超时系统。

比如说:如果IP在最近2秒内已经发送了一个请求,那么它的当前请求应该被拒绝,超时时间变为4秒,此后10秒等等。

if ($timeoutLevel = apc_fetch("locked_" . $ip)){
    $timeoutLevel++;
    $timeout = getNextTimeout($timeoutLevel);
    apc_store("locked_".$ip, $timeoutLevel, $timeout);
    show_my_error_page(get_friendly_text("please do not try again for $timeout seconds! You are Blocked!"));
    exit();
}
else{
    $timeoutLevel = 1;
    $timeout = INITIAL_PAGE_TIMEOUT;
    apc_store("locked_".$ip, $timeoutLevel, $timeout);
}

这应该花费最多约50字节每个ip的最后x秒,所以如果它不是DDOS,那么网络服务器应该有该RAM。

但要小心:一些html页面包含对css,javascript,图像,声音的引用,ajax-calls可能会在以后出现,json-requests等.pp。

在$ timeout秒之后,APC自动降低该值,因此无需雇用清洁女性。

如果您想使用一个SQL命令(但我不知道为什么),您可以使用存储过程:

CREATE PROCEDURE `select_or_insert`()
    MODIFIES SQL DATA
    COMMENT 'blah blah'
BEGIN
    IF ((SELECT COUNT(*) FROM `your_table`) = 10) THEN
        SELECT ... FROM ... ;
    ELSE
        INSERT INTO ... ;
    END IF;
END;

要调用该过程,您将发出以下命令:

CALL `select_or_insert`();

如果执行SELECT ,语句将返回结果集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM