mysql建立序列

2021-07-23 14:05:48 字數 2052 閱讀 8320

提到mysql,我順便講講序列。用過oracle的人都知道,orale沒有類似mysql的auto_increment這樣的自增長字段,實現插入一條記錄,自動增加1.oracle是通過sequence(序列)來完成的。這樣看起來,似乎mysql的自增長要比oracle序列的實現更好更方便。那我為什麼還要提序列呢?有必要嗎? 

(1)首先mysql的自增長「序列」和序列是兩回事,mysql本身不提供序列機制。 

(2)mysql的auto_increment可以設定起始值,但是不能設定步長,其步長預設就是1. 

(3)mysql乙個表只能有乙個自增長字段。自增長只能被分配給固定表的固定的某一欄位,不能被多個表共用。並且只能是數字型。 

(4)在歷史表和資料遷移時,經常會遇到自增主鍵重複的問題。 

(5)自增主鍵往往是沒意義的。 

在下列情況下可能你需要使用序列: 

(1)業務複雜,你需要高度定製和控制主鍵(自增主鍵只能是按數字遞增的,但是序列可以隨心所欲的變化,比如按照年月日生成主鍵。。。) 

(2)你希望手工維護自增長,方便資料遷移; 

(3)當事務跨多表時,期望事務可靠性; 

(4)當你需要乙個業務上有意義的主鍵時,比如單據號等(若你需要的只是乙個流水號,那麼用自增更方便); 

(5)當你的主鍵很明確地需要和其他表關聯時(若你的表不與其他表關聯時,如日誌表,自增更方便) 

(6)你期望這個主鍵是唯一的,不需要重複利用的。 

當然,序列也有缺點,主要就是程式處理麻煩,不如自增方便。oracle的自增有快取,不用擔心效率問題,而mysql只能通過觸發器模擬,可能會有效能損失。 

下面,我們就來實現一下mysql中的序列。 

先建乙個序列表,如下: 

create table if not exists `sequence` (  

`name` varchar(50) not null,  

`current_value` int(11) not null,  

`increment` int(11) not null default '1'  

) engine=myisam default charset=utf8 checksum=1 delay_key_write=1 row_format=dynamic comment='序列表,命名s_[table_name]';  

insert into `sequence` (`name`, `current_value`, `increment`) values  

('s_blog_account', 0, 1) 

drop function if exists `currval`;  

delimiter //  

create  function `currval`(seq_name varchar(50)) returns int(11)  

reads sql data  

deterministic  

begin  

declare value integer;  

set value = 0;  

select current_value into value from sequence where name = seq_name;  

return value;  

end//  

delimiter ;

drop function if exists `nextval`;  

delimiter //  

create  function `nextval`(seq_name varchar(50)) returns int(11)  

deterministic  

begin  

update sequence set current_value = current_value + increment where name = seq_name;  

return currval(seq_name);  

end//  

delimiter ;

最後使用select nextval("s_blog_account")即可得到下乙個值

mysql序列 mysql建立序列

提到mysql,我順便講講序列。用過oracle的人都知道,orale沒有類似mysql的auto increment這樣的自增長字段,實現插入一條記錄,自動增加1.oracle是通過sequence 序列 來完成的。這樣看起來,似乎mysql的自增長要比oracle序列的實現更好更方便。那我為什麼...

mysql建立序列

提到mysql,我順便講講序列。用過oracle的人都知道,orale沒有類似mysql的auto increment這樣的自增長字段,實現插入一條記錄,自動增加1.oracle是通過sequence 序列 來完成的。這樣看起來,似乎mysql的自增長要比oracle序列的實現更好更方便。那我為什麼...

MySql建立序列

用過oracle的人都知道,orale沒有類似mysql的auto increment這樣的自增長字段,實現插入一條記錄,自動增加1.oracle是通過sequence 序列 來完成的。這樣看起來,似乎mysql的自增長要比oracle序列的實現更好更方便。那我為什麼還要提序列呢?有必要嗎?1 首先...