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
从查询的结果来看,第一条记录被删除了,插入了一条新记录。