MySQL或SQLite是否支持"INSERT OR UPDATE"语句?

mid*_*nhk 2 mysql sql sqlite merge

如果我没有错,可以在Oracle中使用"INSERT OR UPDATE"语句.如果主键不存在,则可以创建新行,否则更新该行.或者只能使用某些存储过程或存储函数?

tof*_*tim 6

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] ... ]
Run Code Online (Sandbox Code Playgroud)

对于SQLite,您将使用ON CONFLICT REPLACE

onconflict- 请参阅http://www.sqlite.org/lang_conflict.html

REPLACE发生UNIQUE约束违规时,REPLACE算法会在插入或更新当前行之前删除导致约束违规的预先存在的行,并且命令将继续正常执行.如果发生NOT NULL约束冲突,则REPLACE冲突解决方案将NULL值替换为该列的默认值,或者如果列没有默认值,则使用ABORT算法.如果发生CHECK约束违规,则REPLACE冲突解决算法始终像ABORT一样工作.

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

对于REPLACE冲突解决策略删除的行,不会调用update挂钩.REPLACE也不会增加变更计数器.本段中定义的异常行为可能会在将来的版本中发生变化.