MySQL 4.1.0 中文参考手册 --- 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE[6]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shuixin13 的 blog

  • 通过使用 mysql_insert_id 函数你可以找到用于一个 auto_increment 列的值。查看章节 8.1.3.130 mysql_insert_id()

    如果你使用 insert ... select 或一个 insert ... values 语句插入多值列,你可以使用 c api 函数 mysql_info() 得到查询的信息。信息字串的格式如下:

    records: 100 duplicates: 0 warnings: 0
    

    duplicates 指出因与某些现有的唯一索引值重复而不能被插入的记录行数目。warnings 指出在尝试插入的列值中在某些方面可能有问题的数目。在下列任何一个条件下,警告都会发生:

    • 向一个定义为 not null 的列中插入 null 值。该列被设置为它的缺省值。
    • 将一个超出列范围的值赋给一个数字列。该值被剪切到该范围内的适当的端点。
    • 将一个例如 '10.34 a' 的值赋给一个数字列。尾部的无用信息将被剥离,保留数字部分并将其插入。如果该值看起来根本就不是一个数字,该列将被设置为 0
    • 将一个超出了列最大长度的字符串插入到一个 charvarchartextblob 列中。该值将被剪切到该列的最大长度。
    • 将一个对列类型不合法的值插入到一个日期或时间列中。该列被适当格式的零值。

    6.4.3.1 insert ... select 句法

    insert [low_priority] [ignore] [into] tbl_name [(column list)] select ...
    

    使用 insert ... select 语句,你可以从一个或多个表中读取多个记录行,并将其快速地插入到一个表中。

    insert into tbltemp2 (fldid) select tbltemp1.fldorder_id from tbltemp1 where
    tbltemp1.fldorder_id > 100;
    

    一个 insert ... select 语句有下列条件的限止:

    • insert 语句中的目标表不能在 select 查询部分的 from 子句中出现,因为在 ansi sql 中,禁止你从正在插入的表中 select。(问题是因为,select 可能会发现在同一运行期内先前被插入的记录。当使用子选择子句时,这种情况将会更容易混淆!)
    • auto_increment 列像平常一样工作。
    • 你可以使用 c api 函数 mysql_info() 得到查询的信息。查看章节 6.4.3 insert 句法
    • 为了确保二进制日志可以被用于重建最初的表,mysql 将不允许在 insert ... select 期间并发的插入。

    你当然也可以使用 replace 代替 insert 来盖写老的记录行。

    6.4.4 insert delayed 句法

    insert delayed ...
    

    insert 语句的 delayed 选项是一个 mysql 特有的选项,如果你的客户端不能等待 insert 的完成,这将会是很有用的。this is a common problem when you use mysql for logging and 当你打开日志记录使用 mysql 并且你周期性的需花费很长时间才完成的 selectupdate 语句时,这将是一个很普遍的问题。delayed 在 mysql 3.22.15 中被引入。它是 mysql 对 ansi sql92 的一个扩展。

    insert delayed 仅仅工作与 isammyisam 表。注意,因为 myisam 表支持并发的 selectinsert,如果在数据文件中没有空闲的块,那你将很少需要对 myisam 表使用 insert delayed。查看章节 7.1 myisam

    当你使用 insert delayed 时,客户端将立即得到一个 ok,当表不被任何其它线程使用时,该行将被插入。

    使用 insert delayed 的另一个主要的好处就是,从很多客户端来的插入请求会被打包在一起并写入一个块中。这比做许多单独的插入要快的多。

    注意,当前的记录行队列是被存储在内存中的,一直到他们被插入到表中。这就意味着,如果你使用强制的方法(kill -9) 杀死 mysqld,或者如果意外地死掉,任何没有写到磁盘中的记录行队列都将会丢失!

    下面详细地描述当你为 insertreplace 使用 delayed 选项时会发生什么。在这个描述中,“线程”是遇到一个 insert delayed 命令的线程,“处理器”是处理所有对于一个特定表的 insert delayed 语句的线程。

    • 当一个线程对一个表执行一个 delayed 语句时,将会创建一个处理器线程用以处理对该表的所有 delayed 语句,除非这样的处理器已经存在。

    • 线程检查处理器是否已经获得了一个 delayed 锁;如果还没有,这告诉处理程序去获得。即使其它的线程已在表上加了一个 readwrite 锁,也能获得 delayed 锁。然而,处理器将等待所有的 alter table 锁或 flush tables 以保证表结构是最新的。

    • 线程执行 insert 语句,但是并不将记录行写到表中,它将最终的记录行的副本放到被处理器线程管理的队列中。任何语法错误都会被线程发现并报告给客户程序。

    • 客户端不能报告结果记录行中重复次数或 auto_increment 值;它不能从服务器获得它们,因为 insert 早在插入操作被完成之前就返回了。如果你使用 c api,mysql_info() 函数也因同样的原因而不能获得任何有意义的信息。

    • 当记录行被插入到表中时,二进制的日志文件将被处理器线程更新。对于多记录行的插入,当第一个记录行被插入时,二进制日志被更新。

    • 当每写入 delayed_insert_limit 个记录行后,处理器检查是否仍有任何 select 语句没有解决。如果是这样,处理器允许在继续之前让这些语句先执行。

    • 当处理器发现在它的队列中没有太多的记录行时,表将被解锁。如果在 delayed_insert_timeout 秒内没有接收到新的 insert delayed 命令,处理器线程将终止。

    • 如果在一个特定的处理器队列中已有超过 delayed_queue_size 个记录行未被解决,线程要求 insert delayed 等待,只到在队列中有可用空间。这样做是为了保证 mysqld 服务器对延迟内存队列不使用全部的内存。

  • 本文关键:MySQL 4.1.0 中文
     

    本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

    go top