几个操作MySQL插入(延迟,忽略,重复关键更新)
{ } {插入low_priority延迟high_priority忽略} | |
{在} { }(tbl_name col_name,…)
({ } |默认值表达式,…),(…),…
{重复密钥更新col_name =表达式,…}
或:
{ } {插入low_priority延迟high_priority忽略} | |
{在} tbl_name
设置默认col_name = { } | expr,…
{重复密钥更新col_name =表达式,…}
或:
插入high_priority } { } { low_priority忽略|
{在} { }(tbl_name col_name,…)
选择…
{重复密钥更新col_name =表达式,…}
一、延迟使用
使用延迟插入操作
延迟调节器应用于插入和替换语句。当延迟插入操作到达时,
服务器将数据线放入队列中,并立即将状态信息返回给客户机,以便客户。
在数据表真正插入记录之前,可以继续操作。
数据在表中读取,队列中的数据保存到没有读写器。
开始在延迟数据线(延迟行)队列中插入数据行。
还要检查是否有一个新的读取请求到达和等待。如果存在延迟数据线队列,则挂起。
允许读取器继续操作。当没有读取器时,服务器再次开始插入延迟的数据行。
此过程已完成,直到队列为空。
应注意的几个问题:
插入延迟应仅用于指定值列表的INSERT语句。服务器忽略插入延迟的延迟…SELECT语句。
服务器忽略延迟插入的延迟…关于重复更新语句。
由于插线,声明立即返回,所以不能用last_insert_id()得到auto_increment价值,auto_increment值可由报表生成。
对于SELECT语句,在这些行真正插入之前,延迟行是不可见的。
延迟在从属复制服务器中被忽略,因为延迟不会产生与从属服务器中的主服务器不相同的数据。
值得注意的是,队列中的所有行,目前只存储在记忆中直到他们插入表。这意味着,如果你强行中止mysqld(例如,使用杀9)
如果mysqld意外停止,所有的线都没有写入到磁盘将丢失。
使用两个,忽略
忽略是相对于标准SQL的MySQL的扩展。如果在新表中有一个重复键,
或在启动严格模式后出现警告时,使用忽略控制更改表的操作。
如果未指定忽略,则在重复关键字错误发生并返回到前一步时,复制操作将被放弃。
如果指定了忽略,对于重复关键字的行,只使用第一行,删除其他冲突行。
并纠正错误值,使其尽可能接近正确值。
将忽略插入到TB(…)值(…)
它不需要检查它是否存在,它被忽略,没有添加。
三的使用,关于重复密钥更新
如果在重复密钥更新和插入行上指定,它将在唯一索引或主键中产生重复的值,然后执行旧行更新。例如,如果列A被定义为唯一且包含值1,则以下两个语句具有相同的效果:
MySQL >插入表格(A,B,C)值(1,2,3)
重复密钥更新C = C + 1 - >关于;
更新表集C=C + 1,其中a = 1;
如果将行插入为新记录,则受影响行的值为1;如果更新原始记录,则受影响行的值为2。
注意:如果列B是唯一的列,则插入等同于UPDATE语句:
更新表集C = C + 1,其中A = 1或B = 2限制1;
如果a = 1或b = 2匹配多行,则只更新一行。一般来说,您应该避免使用带有多个关键字的表使用重复关键字子句。
你可以使用价值(col_name)功能在更新条款引用列的值从插入的插入部分…UPDATE语句。换句话说,如果没有重复的关键字冲突,价值观(col_name)在更新条款是指可以插入col_name.this函数值,特别适用于多行插入的值()函数仅在插入有意义…UPDATE语句,并在其他时间返回null。
实例:
MySQL >插入表格(A,B,C)值(1,2,3),(4,5,6)
复制密钥更新>关于C =值(a)+值(b);
本声明与以下两项声明相同:
MySQL >插入表格(A,B,C)值(1,2,3)
重复密钥更新C = 3 - >关于;
MySQL >插入表格(A,B,C)值(4,5,6)
重复密钥更新C = 9 - >关于;
当您使用重复密钥更新时,延迟选项将被忽略。
摘要:延迟被用作一个快速插入,而不是非常关注失败,并提高插入性能。
忽略只注意与记录、添加和忽略相对应的主键的不存在。
重复密钥更新在添加时操作,注意非主键列,并注意与忽略的差异。有指定列的更新,没有添加。