Уникальная запись MySQL на вставках - PullRequest
15 голосов
/ 21 ноября 2011

Я хочу внедрить новую систему реферальных / рекламных акций. моя новая система, в которой, когда пользователь регистрирует конкретный источник, ему назначают. Источником может быть что угодно: от реферала (домен клиента) и промо-кода (например, скидка 50%). У этого источника также есть дата (у-м-д). Каждый идентификатор источника уникален, и несколько пользователей могут иметь один и тот же идентификатор источника

Например:

source id : 1 = www.domain1.com / 2011-11-20 / (empty referal code) 
source id : 2 = www.domain1.com / 2011-11-20 / referalcode1
source id : 3 = www.domain2.com / 2011-11-20 / referalcode1
source id : 4 = www.domain2.com / 2011-11-20 / referalcode2

Код реферала может быть смешан от клиента 1 до клиента 2

Как я могу убедиться, что когда кто-то регистрируется (это бесплатная регистрация, и у нас сейчас более 1000 в час), у нас нет дублирующихся записей и мы рискуем mysql, чтобы вызвать ошибки?

Ответы [ 2 ]

25 голосов
/ 21 ноября 2011

С mysql Страница:

Основная идея состоит в том, чтобы вставлять записи, используя оператор ignore. Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении Вместо этого оператор INSERT обрабатывается как предупреждение. Например, без IGNORE, строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY значение в таблице вызывает ошибку дубликата ключа, и оператор прервана. С IGNORE строка все еще не вставлена, но нет ошибки выпущен. Затем получите последний идентификатор, используя mysql_insert_id

Если запись не существует, она вставит ее и будет возвращен последний идентификатор.

Теперь, если записи не возвращены, вы можете сделать свой выбор. Это означает, что запись уже существует, поэтому просто используйте ее.

Пример:

// make sure $id is safe (preventing sql injections)
$sql = "INSERT IGNORE INTO yourtable SET `field1` = 'value1' ... "; 
mysql_query($sql);

if(mysql_affected_rows() == 1) { // no record found and then the inserts worked
  $id = mysql_insert_id(); // id from the primary key
  // add to cache
}
else {
  // you can also cache them when they were inserted (faster to run than a select statement)
  $id = retreiveFromCache($field1, $field2 /* etc...*/);
  if(!$id) { // no record found in cache
    // now the select can be done using the fields received
    // make sure your use the right index otherwise it can be slow
    $sql = "SELECT id FROM promotions_referrals WHERE `field1` = 'value1' ... "; // 
    $query = mysql_query($sql);
    $row = mysql_fetch_assoc($query);
    $id = $row['id'];
    // add to cache
  }
}

На этом этапе вам будет назначено $id, и вы уверены, что нет повторяющихся ошибок / ошибок mysql.

Примечание: если домен принадлежит одному клиенту, используйте идентификатор клиента вместо использования домена. Таким образом, вы будете использовать INT в качестве индекса, который быстрее, чем VARCHAR. Та же идея для реферального кода.

0 голосов
/ 21 ноября 2011

Вы должны определить свой столбец в MySQL как INTEGER AUTO_INCREMENT PRIMARY KEY.

Когда вы делаете вставки, не указывайте этот столбец:

INSERT INTO referral (domain, date, referralcode) VALUES (?,?,?)

Если вам нужен только что сгенерированный идентификатор, вы можете использовать функцию mysql_insert_id

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