插入行仅如果行不存在(Insert a Row Only if a Row does not Exi

2019-09-01 19:16发布

我建立一个计数器。 我有一篇文章目录和跟踪访问者。 当访问者来到我插入的文章编号,并在数据库中的IP地址。 首先,我检查,看看是否存在知识产权的文章编号,如果IP不存在,我做插入。 这是两个查询 - 有没有办法让这个一个查询

另外,我不使用我经常使用内联SQL存储过程

Answer 1:

这里有一些选择:

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

从MySQL参考手册:“如果使用IGNORE关键字,在执行INSERT语句被视为警告,而不是例如,在不IGNORE发生的错误,即复制现有唯一索引或主键值的行中的表导致重复键错误和声明被中止。“)。如果记录不存在,它将会被创建。

另一种选择是:

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

不会引发错误或警告。



Answer 2:

是的,你创建的列的article_id和IP_ADDRESS的唯一约束。 当您尝试插入重复的INSERT将因错误而被拒绝。 刚才已经回答了同样的问题在这里的SQLite的。



Answer 3:

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


Answer 4:

与SQL Server。 随着T-SQL,你必须检查行的存在,然后使用INSERT或UPDATE适当。

另一种选择是先尝试更新,然后检查行计数,看看是否有更新的记录。 如果没有,然后插入。 给定一个50/50的机会的排在那里,你已执行的时间单个查询50%。

MySQL有一个扩展名为更换具有您所寻求的能力。



Answer 5:

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

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


Answer 6:

我与拉里同意关于使用独特性,但我会实现它是这样的:

  • IP_ADDRESS ,PK
  • ARTICLE_ID ,PK,FK

这确保了记录是唯一命中。 试图插入重复会从数据库中得到一个错误。



Answer 7:

我真的会使用程序! :)

但无论哪种方式,这将可能工作:

创建IP和文章ID列的唯一索引,如果它们已经存在插入查询会失败,所以在技术上它会工作! (关于MySQL测试)



Answer 8:

试试这个(这是一个真正的杂牌组装电脑,但它应该工作...):

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)


文章来源: Insert a Row Only if a Row does not Exist