2014-08-27 9 views
2

я пытаюсь разработать PHP простой скрипт, который можно ввести записи, как это: (MySQL мой дб двигатель)предотвратить значение повторяющегося в тот же день

id (auto increment, primary key) 
StudentName 
StudentNumber 
ClassName 
Grade 
ScreeningDate (mm/dd/yyyy) 

т.д.

теперь, что я необходимо, чтобы номер StudentNumber был введен в тот же день, например, если другой пользователь уже ввел его, тогда в сообщении говорится: этот номер уже был добавлен на сегодня ...

Другими словами, мне нужно перед вставкой, чтобы проверить, существует ли номер studentNumber, затем введите сообщение, другое мудрый, добавит строку нормально ...... следовательно, на следующий день, все в порядке, они могут добавить тот же studentNumber снова, как вчера .... что-то вроде PrimaryKey, но только на сегодня! как это возможно?

+0

Что такое скрининг? Можете ли вы использовать это, чтобы определить, какая дата была добавлена? Если нет, добавьте столбец временной отметки и протестируйте против этого – WillardSolutions

+0

один, но не самый лучший, чтобы использовать триггер перед вставкой http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html, вы также можете проверьте, вставлена ​​ли такая строка с помощью select, и если она показывает ошибку. – Robert

ответ

-1

Это не может быть эффективным, но вы можете получить все строки текущей даты первого:

SELECT StudentNumber, ScreeningDate FROM tablename WHERE StudentNumber = '22' AND ScreeningDate = 'mm/dd/yyyy'; 

И не добавляют (вставка запроса), если выше запрос возвращал более 0 строк (это будет один вообще).

+0

К сожалению, эта тактика имеет потенциальное состояние гонки между 'SELECT' и вставкой. –

+0

Я знаю, что это не самый лучший и его следует избегать. Даже ответ Джонатона почти такой же.: D – Jigar

1

Создайте уникальный составной индекс на (ScreeningDate, StudentNumber). Затем операции INSERT, которые будут помещать дубликаты в вашу таблицу, потерпят неудачу с ошибками с повторяющимися ключами.

Вам нужно будет обнаружить эту ситуацию с дубликатом ключа в вашем PHP-коде и вернуть соответствующее сообщение пользователю, который попытался вставить дубликат. Оператор INSERT вернет ошибку.

Или вы можете использовать INSERT ... ON DUPLICATE KEY UPDATE, если вы хотите обновить строку, если она уже существует. Прочитай это. http://dev.mysql.com/doc/refman/5.6/en/insert.html

Чтобы создать индекс, выполните следующие действия:

ALTER TABLE whatever ADD UNIQUE INDEX NoDailyDups (ScreeningDate, StudentNumber) 

Этот подход имеет то преимущество, что он работает правильно, без явного таблицы блокировки, даже на очень загруженной системе. Если два пользователя участвуют в гонках, чтобы вставить первый предмет для конкретного ученика и день, один из них выиграет, а другой получит ошибку с дубликат-ключом.

Обратите внимание, что ваш стол слегка денормализован - он содержит слегка избыточные данные. Возможно, вы захотите создать другую таблицу, содержащую столбцы StudentNumber и StudentName, и переместите имена студентов из этой таблицы.

+0

Я не знал, как добавить этот составной ключ в мои таблицы (до сих пор), поэтому моя работа заключалась в том, чтобы выполнить хеш-файл md5 по параметрам, которые я хотел создать уникальный ключ. (Пример: $ uniqueKey = md5 ($ studentNumber. $ ScreeningDate;) Затем был столбец, в котором хранились эти хэши, и он должен был быть уникальным. Обычно мне было все равно, была ли вторая попытка, поэтому я использовал INSERT IGNORE. –

0

ли избранная, чтобы получить определенное количество студента на сегодняшнюю дату, как это:

SELECT * FROM table WHERE StudentNumber = 123 AND DATE(ScreeningDate) = CURDATE() 

Если какие-либо строки будут возвращены, есть запись для этого студента номер на сегодняшнюю дату, в противном случае вы можете вставить. Функция DATE извлекает часть даты даты, то есть дату месяца и год

+0

к сожалению эта тактика имеет потенциальное состояние гонки между SELECT и вставкой. –

+0

Не могли бы вы привести пример того, как это может произойти с этим запросом и PHP? – Jonathon

+0

На самом деле, я просто прочитал остальную часть ваш ответ, неважно. – Jonathon

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