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

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

另外,我没有使用存储过程我使用常规内联sql

以下是一些选项:

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; 

不抛出错误或警告。

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

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

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

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

MySQL有一个名为REPLACE的扩展,它具有您所寻求的function。

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

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

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

  • IP_ADDRESS ,pk
  • ARTICLE_ID ,pk,fk

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

我真的会用程序! 🙂

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

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

尝试这个(这是一个真正的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)