С 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. Та же идея для реферального кода.