【问题标题】:Insert a Row Only if a Row does not Exist仅当行不存在时才插入行
【发布时间】:2009-10-28 02:18:37
【问题描述】:

我正在构建一个命中计数器。我有一个文章目录并跟踪唯一访问者。当访问者来时,我在数据库中插入文章 ID 和他们的 IP 地址。首先,我检查文章 id 的 ip 是否存在,如果 ip 不存在,我进行插入。这是两个查询——有没有办法进行这个查询

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

【问题讨论】:

  • 这种行为有时被称为“Upsert”。例如更新或插入。
  • @Robert:我没有看到 Luke 正在做任何更新。它只是插入,或者没有。
  • 我以为他们在跟踪上次访问。我的错。在任何情况下,IP 地址都不适用于跟踪唯一访问 - 例如。 NAT 和 DHCP

标签: c# sql sql-server-2005


【解决方案1】:

这里有一些选项:

 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;

不抛出错误或警告。

【讨论】:

  • 这很酷,但用户使用的是 SQL Server 2005,根据他的标签。
  • 这个答案发布后好像添加了 sql server 标签。
  • @Robert:这不会阻止其他人投反对票。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...)
       INSERT...
    

    【讨论】:

      【解决方案4】:

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

      另一种选择是先尝试 UPDATE,然后检查行数以查看是否更新了记录。如果没有,则插入。假设一行存在 50/50 的机会,您执行单个查询的几率为 50%。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          • IP_ADDRESS,PK
          • ARTICLE_ID, pk, fk

          这确保了一条记录是唯一命中的。尝试插入重复项会导致数据库出错。

          【讨论】:

            【解决方案7】:

            我真的会用程序! :)

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

            为 IP 和文章 ID 列创建唯一索引,如果它们已经存在,插入查询将失败,所以从技术上讲它会起作用! (在mysql上测试过)

            【讨论】:

            • 猜我被拉里打败了 :)
            【解决方案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)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-25
              • 2017-04-30
              • 1970-01-01
              • 1970-01-01
              • 2017-04-21
              • 2016-05-07
              相关资源
              最近更新 更多