SQL Update or Insert

tonchikp

Новичок
Уважаемые форумчане! Требуется ваша помощь!

Подскажите, как правильно? Задача простая, нужно записать визит пользователя в базу данных.
  1. Подключаемся к базе данных.
  2. Обновляем запись о посетителе в таблице.
  3. А вдруг посетитель впервые и его записи нет, значит вставляем запись.
  4. Для развёртывания (для первого запуска): А вдруг таблицы нет, значит создаём таблицу.

Вопрос 1: Беспокоит то, что каждый раз при обновлении (update) куча холостых операций (create, insert), может это как то иначе решается, подскажите.
Вопрос 2: А как вы решаете задачи которые требуются однократно при первом запуске?
Вопрос 3: Подключение к базе данных. Может в другой файл переместить? Но тогда при перемещении файла будут проблемы, а если оставить - то постоянно открывается и закрывается подключение к базе данных в разных файлах.

Код:
$db = new PDO('sqlite:file.sqlite');

$db -> exec("CREATE TABLE IF NOT EXISTS 'tableName' (

id PRIMARY KEY AUTOINCREMENT,
user TEXT UNIQUE NOT NULL,
visitCounter INTEGER DEFAULT '0'

)");

$db -> exec("INSERT OR IGNORE INTO 'tableName' (user) VALUES ('user1')");

$db -> exec("UPDATE 'tableName' SET visitCounter = visitCounter + 1 WHERE user = 'user1'");

unset($db);
 

AnrDaemon

Продвинутый новичок
Начать с того, что sqlite нежелательно использовать для постоянно обновляющейся информации.
Продолжить тем, что создание пользователя не имеет никакого отношения к его визитам.
Ну и закончить можно намёком на то, что вы неправильные вопросы задаёте, а всё от неумения выделить проблемную область.
 

tonchikp

Новичок
Начать с того, что sqlite нежелательно использовать для постоянно обновляющейся информации.
Почему это?
Продолжить тем, что создание пользователя не имеет никакого отношения к его визитам.
Мне кажется итак понятно что код и задача упрощена чтобы легче было разобраться с задачей, а Вы зачем-то цепляетесь к словам, ну или мне так показалось
Ну и закончить можно намёком на то, что вы неправильные вопросы задаёте, а всё от неумения выделить проблемную область.
Ну выделите проблемную область лучше, если лучше умеете
 

AnrDaemon

Продвинутый новичок
Потому что механизм блокировок SQLite будет действовать на нервы всей системе.
И тем больше, чем больше процессов будет пытаться в базу писать.
мне так показалось
Показалось. Точная формулировка проблемы - залог верного решения.
 

tonchikp

Новичок
Потому что механизм блокировок SQLite будет действовать на нервы всей системе.
И тем больше, чем больше процессов будет пытаться в базу писать.
Проблема насколько острая? Если маленький сайтик для ограниченного круга лиц, человек 50
вам надо записывать визиты или время прошедшее с последнего захода?
Хм, а Вы откуда взяли "время прошедшее с последнего захода"? Я вроде не упоминал об этом вообще. Просто интересно стало.
В реальной ситуации я конечно возможно и время захода запишу в базе и многое другое, но пока это лишь уведёт от вопроса в сторону, поэтому будем считать что только визиты, их количество только
 
Сверху