MySQL - возможно, разделить INSERT на 2 запроса

У меня есть запрос INSERT, который выглядит так:

$db->Query("INSERT INTO `surfed` (user, site) VALUES('".$data['id']."', '".$id."')");

По сути, я хочу вставить точно так же, как приведенный выше запрос, но если сайт уже отправлен другим пользователем, я не хочу, чтобы он повторно отправлял тот же $id в столбец сайта. Но несколько пользователей могут просматривать один и тот же сайт, и все пользователи должны находиться в той же строке, что и сайт, который они просматривали, что приводит к тому, что таблица просмотра содержит десятки тысяч вставок, что резко замедляет работу сайта.

Есть ли способ каким-то образом разделить вставку, чтобы, если сайт уже был отправлен, он не отправил его снова для другого пользователя. Может быть, есть способ использовать UPDATE, чтобы не было перегрузки вставок?

Спасибо,


person CustomNet    schedule 29.10.2012    source источник
comment
У вас есть таблица сайтов? Обычно в нормализованной реляционной базе данных у вас будет таблица users, sites, а затем таблица surfed.   -  person Jason McCreary    schedule 29.10.2012
comment
Да у меня они тоже все как отдельные столы, но это всего лишь стол просмотренного стола   -  person CustomNet    schedule 29.10.2012
comment
Почему пытаются предотвратить дублирование записей в таблице surfed?   -  person Jason McCreary    schedule 30.10.2012


Ответы (3)


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

Ознакомьтесь с руководством по хранимым процедурам http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html

person mboldt    schedule 29.10.2012
comment
Ну, как только пользователь просматривает определенный сайт, он выполняет INSERT выше, а затем эта комбинация пользователь-сайт не будет вставлена ​​снова, потому что они не смогут снова просмотреть этот сайт. Это не проблема. - person CustomNet; 29.10.2012

Вам нужно установить условный оператор, который спрашивает, существует ли уже идентификатор, а затем, если он обновляется, в противном случае вставьте

person Joni    schedule 29.10.2012

Если вам не нужно знать, действительно ли вы вставили строку, вы можете использовать INSERT IGNORE ....

$db->Query("INSERT IGNORE INTO `surfed` (user, site) VALUES('".$data['id']."', '".$id."')");

Но это предполагает, что у вас есть уникальный ключ, определенный для столбцов.

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

Справочное руководство MySQL по синтаксису INSERT содержит некоторую информацию об этом http://dev.mysql.com/doc/refman/5.5/en/insert.html

person wiill    schedule 29.10.2012