Уникальная запись mysql на вставках

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

Например:

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 для генерации ошибок?

Ответы

Ответ 1

На странице 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, и вы уверены, что нет ошибок duplicate/mysql.

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

Ответ 2

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

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

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

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