如果行不存在,则仅插入行

时间:2009-10-28 02:18:37

标签: c# sql sql-server-2005

我正在建立一个点击计数器。我有一个文章目录和跟踪唯一访问者。当访问者来时,我将文章ID及其IP地址插入数据库中。首先,我检查文章id是否存在ip,如果ip不存在,我进行插入。这是两个查询 - 有没有办法进行这一个查询

另外,我没有使用我使用常规内联sql

的存储过程

8 个答案:

答案 0 :(得分:3)

以下是一些选项:

 INSERT IGNORE INTO `yourTable`
  SET `yourField` = 'yourValue',
  `yourOtherField` = 'yourOtherValue';
来自MySQL参考手册的

:“如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则会复制现有UNIQUE索引或PRIMARY KEY值的行。 table会导致重复键错误,语句将被中止。“。)如果该记录尚不存在,则会创建该记录。

另一种选择是:

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

不会抛出错误或警告。

答案 1 :(得分:2)

是的,您在列article_id和ip_address上创建了一个UNIQUE约束。当您尝试INSERT复制时,INSERT将被拒绝并出错。刚刚为SQLite回答了同样的问题here

答案 2 :(得分:2)

IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...)
   INSERT...

答案 3 :(得分:1)

不使用SQL Server。使用T-SQL,您必须检查是否存在行,然后根据需要使用INSERT或UPDATE。

另一种选择是首先尝试UPDATE,然后检查行计数以查看是否有更新的记录。如果没有,那么INSERT。如果连续出现50/50的可能性,则您在50%的时间内执行了单个查询。

MySQL有一个名为REPLACE的扩展程序,具有您所寻求的功能。

答案 4 :(得分:0)

我能想到的唯一方法是使用SqlCommand对象执行动态SQL。

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

答案 5 :(得分:0)

我同意Larry关于使用唯一性的观点,但我会像这样实现它:

  • IP_ADDRESS,pk
  • ARTICLE_ID,pk,fk

这可确保记录是唯一的。尝试插入重复项会从数据库中收到错误。

答案 6 :(得分:0)

我真的会用程序! :)

但不管怎样,这可能会奏效:

为IP和文章ID列创建一个UNIQUE索引,如果插入查询已经存在,则插入查询将失败,因此从技术上讲它将起作用! (在mysql上测试)

答案 7 :(得分: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)