Вставить строку, только если строка не существует - PullRequest
2 голосов
/ 28 октября 2009

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

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

Ответы [ 8 ]

3 голосов
/ 28 октября 2009

Вот несколько вариантов:

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

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

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

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

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

2 голосов
/ 28 октября 2009
IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...)
   INSERT...
2 голосов
/ 28 октября 2009

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

1 голос
/ 28 октября 2009

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

Другой вариант - сначала попробовать ОБНОВИТЬ, а затем проверить количество строк, чтобы узнать, была ли обновлена ​​запись. Если нет, то вставьте. При вероятности нахождения строки 50/50 вы выполняете один запрос в 50% случаев.

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

0 голосов
/ 28 октября 2009

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

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)
0 голосов
/ 28 октября 2009

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

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

Создайте УНИКАЛЬНЫЙ индекс для столбцов IP и ID статьи, запрос на вставку не будет выполнен, если они уже существуют, поэтому технически он будет работать! (проверено на MySQL)

0 голосов
/ 28 октября 2009

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

  • IP_ADDRESS, шт
  • ARTICLE_ID, рк, фк

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

0 голосов
/ 28 октября 2009

Я могу думать только о том, чтобы выполнить динамический SQL с использованием объекта SqlCommand.

IF EXISTS(SELECT 1 FROM IPTable where IpAddr=<ipaddr>)
--Insert Statement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...