MYSQL培训准备(1):MYSQL 的数据插入

    这些时应公司要求,需要给开发部培训一下MYSQL,所以一直在想,从什么入手,才能让各位大虾感兴趣!从语法开始吧,这能让熟悉SQL server的最快了解和感兴趣!

    在MYSQL中,除了我们熟悉的INSERT INTO插入语句外,还有一个特殊的语句,REPLACE INTO语句。

1、INSERT INTO语句  

语法一: 

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]  [INTO] tbl_name [(col_name,...)]  VALUES (expression,...),(...),... 

语法二:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]  [INTO] tbl_name [(col_name,...)]  SELECT ... 

语法三: 

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]  [INTO] tbl_name  SET col_name=expression, col_name=expression, ...

    INSERT INTO... VALUES形式的语句基于明确指定的值插入行。一个expression可以引用在一个值表先前设置的任何列。INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2); 但不能这样:INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);.

    INSERT INTO SELECT形式插入从其他表选择的行。它必须满足下列条件:1)查询不能包含一个ORDER BY子句。2)INSERT语句的目的表不能出现在SELECT查询部分的FROM子句;

    如果你为INSERT ... VALUES或INSERT ... SELECT不指定列表,所有列的值必须在VALUES()表或由SELECT提供。如果你不知道表中列的顺序,使用DESCRIBE tbl_name来找出。如果你指定一个列表并没命名表中所有列,未命名的列被设置为它们的缺省值。

    如果你在一个有许多值行的INSERT中指定关键词IGNORE,表中任何复制一个现有PRIMARY或UNIQUE键的行被忽略并且不被插入。如果你不指定IGNORE,插入如果有任何复制现有关键值的行被放弃。

    需要注意的是:

    1)把一个字符串插入到超过列的最大长度的一个CHAR、VARCHAR、TEXT或BLOB列中,值被截断为列的最大长度。

    2)把一个对列类型不合法的值插入到一个日期或时间列,列被设置为该列类型适当的“零”值。

    3)插入NULL到被声明了NOT NULL的列,列被设置为它的缺省值。

    4)将超出列范围的值设置给一个数字列,值被剪切为范围内适当的端点值。

    5)将数字列设成例如'10.34 a'的值,拖尾的垃圾被剥去并仍然是数字部分被插入。如果值根本不是一个数字,列被设置到0。

2、REPLACE INTO语句

语法一:

REPLACE [LOW_PRIORITY | DELAYED] [IGNORE]  [INTO] tbl_name [(col_name,...)]  VALUES (expression,...),(...),... 

语法二:

REPLACE [LOW_PRIORITY | DELAYED] [IGNORE]  [INTO] tbl_name [(col_name,...)]  SELECT ... 

语法三: 

REPLACE [LOW_PRIORITY | DELAYED] [IGNORE]  [INTO] tbl_name  SET col_name=expression, col_name=expression, ...

    REPLACE INTO 跟INSERT INTO功能类似,不同点在于:REPLACE INTO首先尝试插入数据到表中, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 否则,直接插入新数据。类似于SQL Server中以下语句:

if not exists (select 1 from t where id = 1)?  
insert into t(id, update_time) values(1, getdate())  
else  
update t set update_time = getdate() where id = 1 

     需要注意的是:

    1)插入数据的表必须有主键或者是唯一索引!否则的话,REPLACE INTO会直接插入数据,这将导致表中出现重复的数据。

    2)如果一个表中既有主键,又有唯一索引,或者有多个唯一索引时,必须用INSERT INTO和UPDATE代替REPLACE INTO。

    我们创建一张表t_s_alarm,创建一个主键i_id,创建一个唯一索引i_code,语句如下:

create table t_s_alarm(
i_id INT(10) unsigned not null auto_increment,
i_code INT(10) unsigned  not NULL,
v_alarm varchar(100) default NULL,
v_memo VARCHAR(100) default NULL,
primary key (i_id),
unique key (i_code))

    插入三条记录:

INSERT INTO t_s_alarm (i_code, v_alarm, v_memo) VALUES (1, 'alarm1', 'test1'), (2, 'alarm2', 'test1'), (3, 'alarm3', 'test3');

    执行查询结果: 

select * from t_s_alarm

     再执行replace语句,执行结果是影响了2条记录:

REPLACE INTO t_s_alarm (i_code, v_alarm, v_memo) VALUES (1, 'alarm4', 'test4')
执行结果:
Query OK, 2 rows affected (63 ms)

     执行查询结果: 

select * from t_s_alarm

 

从查询的结果来看,第一条记录被删除了,插入了一条新记录。

posted @ 2015-12-29 11:00  @猪头@  阅读(235)  评论(0编辑  收藏  举报