2013-05-08 45 views
0

如何在一个MySQL查询做到这一点:MySQL来选择或插入根据病情

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

我看不出你将如何在单个查询中读取或写入,我的意思是客户端应该如何读取/写入数据?你可以编写一个过程或函数来获取潜在插入的所有参数,并返回潜在的读取数据。 – flaschenpost 2013-05-08 20:11:54

+0

我将在PHP中获取结果,然后根据返回的数据继续。我正在记录IP地址以防止暴力攻击;数字10实际上更少。选择是客户应该等待多少分钟。插入是随着时间记录他的IP。 – gom 2013-05-08 20:16:11

+2

你想要的是一个存储过程。看看这个问题:http://stackoverflow.com/questions/6751881/mysql-stored-procedure-with-if-then-else然后读取MySQL存储过程。 http://dev.mysql.com/doc/refman/5.5/en/stored-programs-defining.html – 2013-05-08 20:19:51

回答

1

如果你想使用一个单一的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,语句将返回结果集。

1

只要只有一个网络服务器参与,我会尝试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); 
} 

之后应该在最后x秒的每IP最大约50字节的成本,所以如果它不是一个DDOS,那么网络服务器应该有这个RAM。

但要注意:一些HTML的网页包含对CSS,JavaScript,图片,声音参考,AJAX通话可能会晚一点,JSON-请求等PP

后$超时秒APC自动删除该值,所以不需要雇佣清洁女工。