【问题标题】:MySQL to select or insert based on conditionMySQL根据条件选择或插入
【发布时间】:2013-05-08 20:07:13
【问题描述】:

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

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

【问题讨论】:

  • 我看不出您在单个查询中如何读取或写入,我的意思是客户端应该如何读取/写入数据?您可以为它编写一个过程或函数,它接受潜在插入的所有参数并可能返回读取的数据。
  • 我会在PHP中获取结果,然后根据返回的数据进行操作。我正在记录 IP 地址以防止暴力攻击; 10号实际上更少。选择是客户端应该等待多少分钟。 Insertion 正在记录他的 IP 时间。
  • 你想要的是一个存储过程。看看这个问题:stackoverflow.com/questions/6751881/… 然后阅读 MySQL 存储过程。 dev.mysql.com/doc/refman/5.5/en/stored-programs-defining.html
  • 然后在 PHP 中做出决定,我建议。计数值,如果超过 9,则拒绝,否则插入。如果网站使用 redis 或 memcache 访问量很大,你甚至可以避免使用 mysql。
  • @EdManet 我不知道什么是 MySQL 过程或存储过程,我试图从链接中了解。我可以通过 PHP 使用它们吗?请通过答案提供更多指导。

标签: mysql


【解决方案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被执行,语句将返回一个结果集。

【讨论】:

    【解决方案2】:

    只要只涉及一个网络服务器,我会尝试 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-calls 可能稍后出现,json-requests 等。pp。

    $timeout 秒后 APC 会自动降低该值,因此无需雇用清洁工。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2017-02-15
      • 1970-01-01
      相关资源
      最近更新 更多