replace into
的三种形式mysql的replace into
有三种形式:
replace into ... values ...
replace into ... select
(valueA, valueB, ...)
/ (from table tbl)
都成立replace into tbl_name set colA=valueA, ...
三种语法似乎让人眼花缭乱,但我们首先要明确一点:replace into
做的是什么,这样它后面不管跟的是values
、select
还是set
都不重要。
replace into
的行为开门见山地说,replace into
做的事情是:
什么时候新添加一条row,什么时候新添加多条row: 后跟
values
,set
和replace into ... select (valueA, valueB, ...)
时是一行。后跟select ... from table tbl
时会将表tbl里的所有行导入,所以可能是多行。
values
、select
和set
的行为然后不管跟随的是values
、select
还是set
,都只是在指定新条目的值而已(在有唯一键重复时,被重复的行是直接删除掉的)。
其中,
values
不必多说,语法类似于insert into
replace select
的语法也类似于insert select
。这种用法并不一定要求列名匹配,事实上,MYSQL甚至不关心select返回的列名,它需要的是列的位置。例如,replace into tb1( name, title, mood) select rname, rtitle, rmood from tb2;
这个例子使用replace into
从tb2中将所有数据导入tb1中。replace set
用法类似于update set
用法,使用一个例如SET col_name = col_name + 1
的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)
(默认值)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1
。前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。
我们以第三种语法set
为例,分别去理解replace into
和set
的行为。这样举一反三,就能理解另外两种形式。
先在数据库test建一个表名叫user,情况如下:
uid为主键, phone_number为唯一键,非空,age的默认值为2。 插入两条数据:
然后运行
replace into test.user set phone_number = "139", age = age + 1;
结果为
这里,键"phone_number"并不重复,故直接插入。键"age"的默认值为2,age = age + 1
实际上执行的是age = DEFAULT(age) + 1
。
接着上面的例子,运行
replace into test.user set phone_number = "138", age = age + 1;
我们看到,
name
属性没有继承之前那条,age
属性的值也只是由默认值决定,与上一条的值无关。由此证明结论:
这一点对于replace into的三个语法都成立。然后不管跟随的是values
、select
还是set
,都只是在指定新条目的值而已(因为在有唯一键重复时,被重复的row是直接删除掉的)。