好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mysqlinsert操作

insert的语法 INSERT [ LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [ IGNORE ] [ INTO ] tbl_name [ (col_name,...) ] VALUES ({expr | DEFAULT },...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [ LOW_PRIORITY | DELAYED | H

insert的语法

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

  INSERT   [  LOW_PRIORITY | DELAYED | HIGH_PRIORITY  ]   [  IGNORE  ] 
     [  INTO  ]   tbl_name
      SET   col_name  = {expr  |   DEFAULT  }, ...
      [   ON DUPLICATE KEY UPDATE col_name=expr, ...   ]  
或:

  INSERT   [  LOW_PRIORITY | HIGH_PRIORITY  ]   [  IGNORE  ] 
     [  INTO  ]  tbl_name  [  (col_name,...)  ] 
     SELECT   ...
      [   ON DUPLICATE KEY UPDATE col_name=expr, ...   ]  

如果列清单和 VALUES 清单均为空清单,则 INSERT 会创建一个行,每个列都被设置为默认值:

  INSERT   INTO  tbl_name ()  VALUES (); 

假设worker表只有name和email,插入一条数据

 insert   into  worker  values (“tom”,”tom @yahoo .com”); 

批量插入多条数据

 insert   into  worker  values (‘tom’,’tom @yahoo .com’),(‘paul’,’paul @yahoo .com’); 

给出要赋值的那个列,然后再列出值的插入数据

 insert   into  worker (name)  values   (‘tom’);
  insert   into  worker (name)  values  (‘tom’), (‘paul’); 

使用set插入数据

 insert   into  worker  set  name = ’tom’; 

在 SET 子句中未命名的行都赋予一个缺省值,使用这种形式的 INSERT 语句不能插入多行。

一个expression可以引用在一个值表先前设置的任何列,例如

 INSERT   INTO  tbl_name (col1,col2)  VALUES (  15  ,col1 *   2   );
  --  但不能这样 
 INSERT   INTO  tbl_name (col1,col2)  VALUES (col2 *   2  ,  15  ); 

使用INSERT…SELECT语句插入从其他表选择的行

 insert   into  tbl_name1(col1,col2)  select  col3,col4  from   tbl_name2;
  --  如果每一列都有数据 
 insert   into  tbl_name1  select  col3,col4  from  tbl_name2; 

查询不能包含一个ORDER BY子句,而且 INSERT语句的目的表不能出现在SELECT查询部分的FROM子句.

ON DUPLICATE KEY UPDATE

如果您指定了 ON DUPLICATE KEY UPDATE ,并且插入行后会导致在一个 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则执行旧行 UPDATE 。

 --  假设a,b为唯一索引,表table没有1,2这样的行是正常插入数据,冲突时,更新c列的值 
 INSERT   INTO   table  (a,b,c)  VALUES  (  1  ,  2  ,  3  )  ON  DUPLICATE  KEY   UPDATE  c =   3   ;
  --  或者是 
 INSERT   INTO   table  (a,b,c)  VALUES  (  1  ,  2  ,  3  )  ON  DUPLICATE  KEY   UPDATE  c =  values  (c);
  --  引用其他列更新冲突的行 
 INSERT   INTO   table  (a,b,c)  VALUES  (  1  ,  2  ,  3  ),(  4  ,  5  ,  6  )  ON  DUPLICATE  KEY   UPDATE  c =  VALUES (a) +  VALUES (b); 

向一个已定义为 NOT NULL 的列中插入 NULL 。对于一个多行 INSERT 语句或 INSERT INTO...SELECT 语句,根据列数据的类型,列被设置为隐含的默认值。对于数字类型,默认值为 0 ;对于字符串类型,默认值为空字符串 ( '' ) ;对于日期和时间类型,默认值为“ zero ”值。

INSERT INTO...SELECT的ON DUPLICATE KEY UPDATE

 insert   into   tbl_name1(a,b,c) 
    select  col1,col2,col3  from   tbl_name2 
  ON  DUPLICATE  KEY   UPDATE  c =  values (c); 

INSERT DELAYED

如果您的客户端不能等待 INSERT 完成,则这个选项是非常有用的, 当一个客户端使用 INSERT DELAYED 时,会立刻从服务器处得到一个确定。并且行被排入队列,当表没有被其它线程使用时,此行被插入。

使用 INSERT DELAYED 的另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。

 INSERT  DELAYED  INTO  worker (name)  values  (‘tom’), (‘paul’); 

使用 DELAYED 时有一些限制:

INSERT DELAYED 仅适用于 MyISAM, MEMORY 和 ARCHIVE 表。对于 MyISAM 表,如果在数据文件的中间没有空闲的块,则支持同时采用 SELECT 和 INSERT 语句。在这些情况下,基本不需要对 MyISAM 使用 INSERT DELAYED 。 INSERT DELAYED 应该仅用于指定值清单的 INSERT 语句。服务器忽略用于 INSERT DELAYED...SELECT 语句的 DELAYED和 INSERT DELAYED...ON DUPLICATE UPDATE 语句的 DELAYED 。 因为在行被插入前,语句立刻返回,所以您不能使用 LAST_INSERT_ID() 来获取 AUTO_INCREMENT 值。 AUTO_INCREMENT 值可能由语句生成。 对于 SELECT 语句, DELAYED 行不可见,直到这些行确实被插入了为止。 DELAYED 在从属复制服务器中被忽略了,因为 DELAYED 不会在从属服务器中产生与主服务器不一样的数据。

查看更多关于mysqlinsert操作的详细内容...

  阅读:31次