这些语法是好用但是要注意语句结束后的返回值情况
MySQL中常用的三种插入数据的语句:
insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
insert ignore表示,如果表中如果已经存在相同的记录,则忽略当前新数据;
测试代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
create
table
testtb(
id
int
not
null
primary
key
,
name
varchar
(50),
age
int
);
insert
into
testtb(id,
name
,age)
values
(1,
'bb'
,13);
select
*
from
testtb;
insert
ignore
into
testtb(id,
name
,age)
values
(1,
'aa'
,13);
select
*
from
testtb;
replace
into
testtb(id,
name
,age)
values
(1,
"aa"
,12);
select
*
from
testtb;
|
用INSERT DELAYED解决MySQL堵塞问题】
[separator]
所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT一样。 您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
为了能够使用REPLACE,您必须同时拥有表的INSERT和DELETE权限。
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。
2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
a. 从表中删除含有重复关键字值的冲突行
b. 再次尝试把新行插入到表中
使用格式如下:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},…),(…),…
或:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, …
或:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT …
INSERT
INTO
osc_visit_stats(stat_date,type,id,view_count)
VALUES
(?,?,?,?)
ON
DUPLICATE
KEY
UPDATE
view_count=view_count+?
INSERT
INTO
osc_space_visit_records(
space
,
user
,visit_count,ip,visit_time)
VALUES
(?,?,?,?,?)
ON
DUPLICATE
KEY
UPDATE
visit_count=visit_count+1,ip=?,visit_time=NOW()
如果不会导致唯一值列重复的问题,则插入新行。
/*Merge into 详细介绍
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
*/
/*語法:
MERGE [INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
*/
语法:
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ]
- 1,可省略的update 或者insert
- MERGE INTO products p
- 2 USING newproducts np
- 3 ON (p.product_id = np.product_id)
- 4 WHEN MATCHED THEN
- 5 UPDATE
- 6 SET p.product_name = np.product_name,
- 7 p.category = np.category;
使用表newproducts中的product_name 和category字段来更新表products 中相同product_id的product_name 和category.
2,当条件不满足的时候把newproducts表中的数据INSERT 到表products中。
- MERGE INTO products p
- USING newproducts np
- ON (p.product_id = np.product_id)
- WHEN NOT MATCHED THEN
- INSERT
- VALUES (np.product_id, np.product_name,
- np.category);
3,带条件的insert 和update
- MERGE INTO products p
- USING newproducts np
- ON (p.product_id = np.product_id)
- WHEN MATCHED THEN
- UPDATE
- SET p.product_name = np.product_name
- WHERE p.category = np.category;
insert 和update 都带有where 字句
- MERGE INTO products p
- USING newproducts np
- ON (p.product_id = np.product_id)
- WHEN MATCHED THEN
- UPDATE
- SET p.product_name = np.product_name,
- p.category = np.category
- WHERE p.category = 'DVD'
- WHEN NOT MATCHED THEN
- INSERT
- VALUES (np.product_id, np.product_name, np.category)
- WHERE np.category != 'BOOKS'
4,无条件的insert
- MERGE INTO products p
- USING newproducts np
- ON (1=0)
- WHEN NOT MATCHED THEN
- INSERT
- VALUES (np.product_id, np.product_name, np.category)
- WHERE np.category = 'BOOKS'
5,delete 子句
1 merge into products p
2 using newproducts np
3 on(p.product_id = np.product_id)
4 when matched then
5 update
6 set p.product_name = np.product_name
7 delete where category = 'macle1_cate';