2013-05-08 3 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

+0

Я принесу результат в PHP, а затем продолжу в соответствии с возвращенными данными. Я регистрирую IP-адреса для защиты от атак с грубой силой; число 10 на самом деле меньше. Выбор - сколько минут клиент должен ждать. Вставка регистрирует свой IP-адрес со временем. – gom

+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 –

ответ

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); 
} 

Это должен стоить макс. около 50 байт за ip за последние x секунд, поэтому, если это не DDOS, то веб-сервер должен иметь эту оперативную память.

Но будьте осторожны: некоторые. HTML-страницы содержат ссылки на CSS, JavaScript, изображения, звуки, Ajax-вызовы могут прийти позже, JSON-запросы и т.д. С.

После $ таймаут секунд APC автоматически снижается, что значение , поэтому нет необходимости нанимать женщин-уборщиков.

Смежные вопросы