【问题标题】:SQL Replace Into questionSQL 替换成问题
【发布时间】:2011-02-14 04:00:08
【问题描述】:

如果我有两个字段,则使用 Replace Into。名字姓氏。如果我要运行 REPLACE INTO tblNames (FirstName, LastName) VALUES (John, Jones),该表中有 John Smith 这会用琼斯取代史密斯,还是创建一个新名字?

什么决定了它是更新还是插入?

【问题讨论】:

    标签: sql mysql replace


    【解决方案1】:
    REPLACE
    INTO    tblNames (FirstName, LastName)
    VALUES  ('John', 'Jones')
    

    如果在 FirstNameLastName 或其组合上存在任何类型的唯一约束并且违反了该约束,则记录将被删除并插入新值。

    如果满足任何条件,记录将被替换:

    • FirstNameUNIQUE 并且表格中有一个John
    • LastNameUNIQUE 并且表格中有一个 Jones
    • FirstName, LastnameUNIQUE 并且表格中有一个 John Jones

    请注意,REPLACE 操作是 INSERT 可能跟在 DELETE 之后,这将始终影响表格。

    在较新版本的MySQL 中,您应该使用INSERT … ON DUPLICATE KEY UPDATE

    【讨论】:

    • 所以如果 John Smith 在表中,并且我发送 John Jones,我使用什么 sql 命令来插入 John Jones,但是如果我发送 John Smith,它什么也不做。
    • @Matt: 请发布SHOW CREATE TABLE tblNames的输出
    • 还没有桌子..这是假设计划:)
    • @Greg K:太棒了!这就是REPLACE INTOINSERT INTO ... ON DUPLICATE KEY UPDATE 之间的区别!! (我在想)
    【解决方案2】:

    这取决于表上的主键和/或唯一约束。如果没有主键或唯一约束,则与基本的 INSERT 语句没有区别。

    文档给出了相当清晰的解释:http://dev.mysql.com/doc/refman/5.0/en/replace.html

    【讨论】:

      【解决方案3】:

      插入和更新有两种不同的操作符

      update tblNames set FirstName="John", LastName="Smith" where FirstName="John" and LastName="Jones"
      

      这会将 John Jones 重命名为 John Smith

      insert into tblNames (FirstName, LastName) values ("John", "Smith")
      

      这将添加一个新条目(但如果表中已经存在 John Smith 并且 FirstName/LastName 存在唯一约束,则可能会失败)

      【讨论】:

      • 当我回答时没有“mysql”标签,所以我的代码示例是标准 SQL
      • 如果记录已经存在,有没有办法避免插入时出错?
      • 您可以在执行更新或插入之前执行“选择”以检查条目是否已存在。不确定 MySQL,但在 SQL Server 中,您甚至可以避免选择。典型场景:update tblNames set ... where key-condition if @@rowcount = 0 -- 受最后一条语句(即更新)影响的行数插入 tblNames .... 抱歉,对于迟到的答案,希望这有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2018-01-04
      • 2020-08-21
      • 2012-02-15
      • 1970-01-01
      • 2015-03-28
      • 2014-06-12
      相关资源
      最近更新 更多