Вставка Mysql только если предел не был достигнут

Надеюсь, у меня есть право называться, так как я не знаю, как это сказать!

Вот фон …

У меня есть приложение, вставляющее данные в db. Db содержит поле даты и поле данных (есть другие, но для простоты эти два являются единственными необходимыми). В тот же день может быть только 8 записей, не более. При нормальной работе это не проблема, но два раза в месяц база данных сильно ударяется к концу дня.

Способ, которым я сейчас это делаю, заключается в том, чтобы запросить количество записей для даты. Если это меньше 9, я вставляю данные.

Это еще не произошло, но я беспокоюсь, что запрос А входит и проверяет БД и находит 7 записей. ОК для вставки. Но до того, как A может вставить, запрос B входит и находит только 7 записей. ОК для вставки. Но тогда будет введено 9 записей на одну дату. Этого не может быть.

Я думаю, что есть два решения, но хотелось бы знать А, если я прав! или B – лучшее решение.

Я думаю…

A) Я мог бы сделать это в транзакции. Однако, я бы не столкнулся с той же проблемой? Насколько мне известно, пока запросы в транзакции не сработают, она все равно работает.

или

B) Сначала используйте хранимую процедуру для проверки, а затем вставьте. У меня было очень мало опыта с хранимыми процедурами, поэтому я должен признать, что понятия не имею, о чем я говорю здесь!

Кроме того, есть ли способ получить один запрос для проверки, если есть менее 9 записей?

Спасибо заранее,

Gavin

Вы боитесь, что кто-то вложит новую запись, прежде чем другие вставляют ее даже в миллион секунд?

У меня тоже есть этот вопрос, поэтому я просто что-то искал для вас, вы можете сделать это двумя способами:

Например, если у вас есть таблица с именем date_table и она выглядит так:

 date_field ---------- 1998-07-13 1992-03-23 1998-09-17 1994-02-30 

A) Подсчитайте строки, затем вставьте их, когда они находятся под 8 строками. (Использование PHP и MySQL)

Во-первых, получите количество строк:

 SELECT COUNT(*) AS Num FROM date_table WHERE date_field = '1998-07-13' 

поэтому вы получите поле Num котором говорилось, сколько строк было в 1998-07-13 ,

затем с помощью PHP запретить пользователю вставлять ту же дату, когда она равна 8:

 <?php if($DB['Num'] >= 8) exit('Sorry, no more same value'); ?> 

иначе вставьте строку.


Или вы не доверяете PHP, или вы думаете, что кто-то вставляет строку более, чем 1 миллион секунд

B) Вставьте его, когда он находится только под 8 строками, с одним запросом:

 INSERT INTO date_table (date_field) SELECT '1998-07-13' FROM dual WHERE (SELECT COUNT(*) FROM date_table WHERE date_field = '1998-07-13') < 9; 

BEWARE: dual – системная таблица mysql, поэтому вам не нужно ее создавать

Если вы не понимаете, как работает этот запрос:

 insert into TABLE_NAME (TABLE_FIELD) select VALUE_YOU_WANT_TO_INSERT from dual where (select count(*) from TABLE_NAME where THE_FIELD_YOU_WANT_TO_CHECK = '1998-07-13' ) < LESS_THEN_HOW_MUCH; 

EDIT : добавьте больше полей, изменив следующие строки:

 INSERT INTO date_table (field1, field2, field3) SELECT value1, value2, value3