Надеюсь, у меня есть право называться, так как я не знаю, как это сказать!
Вот фон …
У меня есть приложение, вставляющее данные в 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