【问题标题】:Does MySQL or SQLite support 'INSERT OR UPDATE' Statements?MySQL 或 SQLite 是否支持“插入或更新”语句?
【发布时间】:2011-08-31 15:04:25
【问题描述】:

如果我没记错的话,Oracle 中可以使用“插入或更新”语句。如果主键不存在则创建新行或更新该行的可能性。还是只能使用一些存储过程或存储函数?

【问题讨论】:

    标签: mysql sql sqlite merge


    【解决方案1】:

    MySQL:

    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
        [ ON DUPLICATE KEY UPDATE
          col_name=expr
            [, col_name=expr] ... ]
    

    对于 SQLite,您将使用 ON CONFLICT REPLACE

    - 见http://www.sqlite.org/lang_conflict.html

    REPLACE 当一个 UNIQUE 约束 违规发生时,REPLACE 算法删除预先存在的行 导致约束的 插入前违反或 更新当前行和 命令继续正常执行。 如果 NOT NULL 约束违反 发生,REPLACE冲突 分辨率替换 NULL 值 使用该列的默认值, 或者如果该列没有默认值, 然后使用 ABORT 算法。如果一个 CHECK 约束违反发生时, REPLACE 冲突解决算法 总是像 ABORT 一样工作。

    当REPLACE冲突解决 策略删除行以 满足约束,删除触发器 当且仅当递归触发时触发 已启用。

    更新钩子没有被调用 由 REPLACE 删除的行 冲突解决策略。也没有 REPLACE 增加更改计数器。 定义的异常行为 这一段可能会改变 未来版本。

    【讨论】:

    • 你能给我举个例子吗?也许我不明白。当它发现冲突时,它总是进行删除->插入或考虑进行更新?什么时候(如果是的话)只更新一次?
    猜你喜欢
    • 2010-09-24
    • 2017-07-05
    • 2012-10-29
    • 2013-02-23
    • 1970-01-01
    • 2021-05-18
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多