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。 -
将一个超出了列最大长度的字符串插入到一个
char、varchar、text或blob列中。该值将被剪切到该列的最大长度。 - 将一个对列类型不合法的值插入到一个日期或时间列中。该列被适当格式的零值。
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.3insert句法。 -
为了确保二进制日志可以被用于重建最初的表,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 并且你周期性的需花费很长时间才完成的 select 和 update 语句时,这将是一个很普遍的问题。delayed 在 mysql 3.22.15 中被引入。它是 mysql 对 ansi sql92 的一个扩展。
insert delayed 仅仅工作与 isam 和 myisam 表。注意,因为 myisam 表支持并发的 select 和 insert,如果在数据文件中没有空闲的块,那你将很少需要对 myisam 表使用 insert delayed。查看章节 7.1 myisam 表。
当你使用 insert delayed 时,客户端将立即得到一个 ok,当表不被任何其它线程使用时,该行将被插入。
使用 insert delayed 的另一个主要的好处就是,从很多客户端来的插入请求会被打包在一起并写入一个块中。这比做许多单独的插入要快的多。
注意,当前的记录行队列是被存储在内存中的,一直到他们被插入到表中。这就意味着,如果你使用强制的方法(kill -9) 杀死 mysqld,或者如果意外地死掉,任何没有写到磁盘中的记录行队列都将会丢失!
下面详细地描述当你为 insert 或 replace 使用 delayed 选项时会发生什么。在这个描述中,“线程”是遇到一个 insert delayed 命令的线程,“处理器”是处理所有对于一个特定表的 insert delayed 语句的线程。
-
当一个线程对一个表执行一个
delayed语句时,将会创建一个处理器线程用以处理对该表的所有delayed语句,除非这样的处理器已经存在。 -
线程检查处理器是否已经获得了一个
delayed锁;如果还没有,这告诉处理程序去获得。即使其它的线程已在表上加了一个read或write锁,也能获得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服务器对延迟内存队列不使用全部的内存。