2009-10-28 2 views
2

Я создаю счетчик посещений. У меня есть каталог статей и отслеживание уникальных посетителей. Когда посетитель приходит, я вставляю идентификатор статьи и свой IP-адрес в базу данных. Сначала я проверяю, существует ли ip для идентификатора статьи, если ip не существует, я делаю вставку. Это два запроса - есть способ сделать это один запросВставьте строку только в том случае, если строка не существует

Кроме того, я не использую хранимые процедуры, я использую регулярный встроенный SQL

+0

Такое поведение иногда называют 'Upsert'. например Обновить или вставить. –

+1

@ Robert: Я не вижу, чтобы Люк делал обновление. Это просто вставка, или нет. –

+0

Я предполагал, что они следили за последним посещением. Виноват. В любом случае IP-адреса не подходят для отслеживания уникальных посещений - например. NAT и DHCP –

ответ

2

Да, вы создаете UNIQUE ограничения на столбцы article_id и ip_address , Когда вы пытаетесь ВСТАВИТЬ дубликат, INSERT будет отклонено с ошибкой. Просто ответил на тот же вопрос here для SQLite.

0

Единственный способ, которым я могу думать, - выполнить динамический SQL с помощью объекта SqlCommand.

IF EXISTS(SELECT 1 FROM IPTable where IpAddr=<ipaddr>) 
--Insert Statement 
0

Я согласен с Ларри об использовании уникальности, но я бы реализовать это следующим образом:

  • IP_ADDRESS, рк
  • ARTICLE_ID, рк, Д

Это гарантирует, что запись - уникальный хит. Попытки вставить дубликаты получат ошибку из базы данных.

0

Я бы действительно использовал процедуры! :)

Но в любом случае, это вероятно, будет работать:

Создать уникальный индекс для обоих столбцов ID IP и статьи, запрос вставки потерпит неудачу, если они уже существуют, так что технически это будет работать! (Проверено на MySQL)

+0

Догадка, что я получил его от Ларри :) –

3

Вот некоторые варианты:

INSERT IGNORE INTO `yourTable` 
    SET `yourField` = 'yourValue', 
    `yourOtherField` = 'yourOtherValue'; 

из Справочного руководства по MySQL: «Если вы используете игнора ключевое слово, ошибки, возникающие при выполнении оператора INSERT рассматриваются как предупреждения, а не, например. , без IGNORE, строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с повторяющимся ключом, и оператор прерывается. ".) Если запись еще не существует, она будет создана.

Другой вариант:

INSERT INTO yourTable (yourfield,yourOtherField) VALUES ('yourValue','yourOtherValue') 
ON DUPLICATE KEY UPDATE yourField = yourField; 

Не бросать ошибку или предупреждение.

+3

Это классно, но пользователь использует SQL Server 2005 в соответствии с его тегом. –

+0

похоже, что после этого ответа был добавлен тег sql server. –

+0

@Robert: Это не остановит других от downvoting. –

1

Не с SQL Server. С помощью T-SQL вам нужно проверить наличие строки, затем используйте как INSERT, так и UPDATE.

Другой вариант - сначала попробовать UPDATE, а затем проверить количество строк, чтобы увидеть, была ли обновлена ​​запись. Если нет, то INSERT. Учитывая 50/50 вероятность наличия строки, вы выполнили один запрос в 50% случаев.

У MySQL есть расширение, называемое REPLACE, у которого есть возможность, которую вы ищете.

0

попробуйте это (это настоящий kludge, но он должен работать ...):

Insert TableName ([column list]) 
Select Distinct @PK, @valueA, @ValueB, etc. -- list all values to be inserted 
From TableName 
Where Not Exists 
    (Select * From TableName 
    Where PK == @PK) 
2
IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...) 
    INSERT... 
Смежные вопросы