MySQL自定義變數的三個小技巧

壹頁書發表於2015-01-25
高效能MySQL 244頁

1.指定表的訪問順序

實驗資料:
user是活躍使用者表,
user_archived是長時間不活躍的使用者表.
兩個表的結構相同,冷熱資料分開.
create table user
(
    id int primary key,
    name varchar(20)
);
create table user_archived
(
    id int primary key,
    name varchar(20)
);
insert into user select 1,'user1';
insert into user select 2,'user2';
insert into user_archived select 3,'user3';
insert into user_archived select 4,'user4';
commit;

需求:
先訪問user表資料,
如果有結果,則直接返回,不再查詢user_archived表;
如果沒有結果,則查詢user_archived表的資料.

實現:
set @userid:=1;
select 
    greatest(@found:=-1,id) as id,name,'user' tabname
    from user where id=@userid
union all
    select id,name,'user_archived' 
    from user_archived where id=@userid and @found is null
union all
    select 1,1,'reset' from dual where (@found:=null) is not null;

第三個SQL先執行賦值,
第一個SQL如果查到任意一個資料,就會修改@found的值,
第二個SQL根據@found的值,決定是否執行SQL


2.更新的同時,順帶查詢資料
實驗資料:
drop table test;
create table test
(
    id int primary key,
    name varchar(20),
    ts timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
insert into test(id,name) select 1,'user1';
commit;

更新這個資料,並查詢這個資料之前的時間戳.
update test set name='u1'  where id=1 and @now:=ts ;
select @now;


3.統計on duplicate key update更新的數量
實驗資料:
create table t1 
(
    a int primary key,
    b int
);
insert into t1 values(1,1),(2,2),(3,3),(4,4);
commit;

執行on duplicate key update
set @x:=0;
insert into t1 values(2,100),(3,100) 
on duplicate key update b=values(b)+(0*(@x:=@x+1));



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1414176/,如需轉載,請註明出處,否則將追究法律責任。

相關文章