Добавление невидимых пользователей в базу данных SQL без дубликатов

#mysql #sql

Вопрос:

Я хочу очистить форум и создать таблицу пользователей для каждого отдельного пользователя, которого я вижу, и это выглядит так:

Стол:

 user_id (primary key), name, date_seen
 

Поэтому, если я увижу нового невидимого пользователя, добавьте его в свою базу данных. Если новый пользователь уже находится в моей базе данных, не добавляйте его в мою базу данных.

Как я могу это сделать?

Комментарии:

1. Если имя пользователя или идентификатор уникальны (или используются в качестве первичного ключа), не нужно беспокоиться о дубликатах, потому что это не позволит вам их добавлять. Если вы вставляете несколько строк одновременно, вы можете использовать команду ВСТАВИТЬ ИГНОРИРОВАТЬ.

2. Вставляя несколько строк одновременно, вы имеете в виду: ВСТАВИТЬ В имя_таблицы (список столбцов) ЗНАЧЕНИЯ (value_list_1), (value_list_2), … (value_list_n);

3. Я не знаю, как вы выполняете свою вставку или откуда берутся ваши исходные данные (как вы очищаете). Вы записываете пользователей в файл? Потому что вы можете импортировать CSV и сделать все в одной строке: ЗАГРУЗИТЕ ЛОКАЛЬНЫЙ ФАЙЛ ДАННЫХ «filename.csv», ИГНОРИРУЕМЫЙ В ТАБЛИЦЕ …… Или, если значения поступают из другой таблицы, вы выполняете вставку из инструкции select.

Ответ №1:

Предположительно, под «невидимым пользователем» вы подразумеваете имя, а не идентификатор пользователя.

Вы можете использовать insert on duplicate key . Начните с уникального индекса или ограничения на » имя:

 create unique index unq_users_name on users(name);
 

Затем:

 insert into users (name, date_seen)
    values ($name, $date_seen)
    on duplicate key update name = values(name);
 

Обратите внимание, что VALUES() теперь это устарело в пользу немного другого синтаксиса, но он все еще работает.

Ответ №2:

Стандартный способ «вставить то, чего еще нет» в SQL-это использовать коррелированный подзапрос для проверки наличия:

 insert into users (name, date_seen)
values ($name, $date_seen)
where not exists (select 1 from users where name = $name )
 

Этот метод не зависит от какого-либо нестандартного синтаксиса в вашей СУБД.