Mycat探索之旅(4)----Mycat的自增長主鍵和返回生成主鍵ID的實現


 

說明:MyCAT自增長主鍵和返回生成主鍵ID的實現

1) mysql本身對非自增長主鍵,使用last_insert_id()是不會返回結果的,只會返回0;這里做一個簡單的測試

  • 創建測試表
--------------------------------------
--創建測試表
-------------------------------------

USE test;

CREATE TABLE

IF NOT EXISTS t_auto_increment (

id INT NOT NULL PRIMARY KEY,

NAME VARCHAR (50)

) ENGINE = INNODB DEFAULT CHARSET = utf8;
  • 添加測試語句
INSERT INTO t_auto_increment(id,name) VALUES(1,'auto_01');

SELECT LAST_INSERT_ID();
  • 測試結果

clip_image001

  • 修改表
ALTER TABLE t_auto_increment MODIFY id int auto_increment;

DESC t_auto_increment;

clip_image002

  • 添加測試
INSERT INTO t_auto_increment(name) VALUES('auto_02');

SELECT LAST_INSERT_ID();

clip_image003

2) mysql只會對定義自增長主鍵,可以用last_insert_id()返回主鍵值;MyCAT目前提供了自增長主鍵功能,但是如果對應的mysql節點上數據表,沒 有定義auto_increment,那么在MyCAT層調用last_insert_id()也是不會返回結果的。

正確配置方式如下:

1) mysql定義自增主鍵

--------------------------------------------

--創建測試表

--------------------------------------------

CREATE TABLE

IF NOT EXISTS tb_auto_increment (

id INT NOT NULL PRIMARY KEY auto_increment,

NAME VARCHAR (100)

) DEFAULT charset = utf8;

2) mycat定義主鍵自增:修改schema.xml

<!--autoIncrement="true"表示該表主鍵使用自增長策略-->

<table name="tb_auto_increment" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" />

clip_image004

3) mycat對應sequence_db_conf.properties增加相應設置

# blow tables add by yzp 2016.03.10

TB_AUTO_INCREMENT=dn1

注:這里的TB_AUTO_INCREMENT一定要大寫,我最開始的時候用小寫一直報下面的錯誤:

image

意思是說配置的時候沒有找到TB_AUTO_INCREMENT,也就是sequence_db_conf.properties文件中添加的內容有誤,當改為大寫后,不再報錯。

4) 在數據庫中mycat_sequence表中增加TABLE1表的sequence記錄

INSERT INTO mycat_sequence (

NAME,

current_value,

increment

)

VALUES

('tb_auto_increment', 100, 1);

clip_image005

當前值為100,步長為1

測試使用:

第一組測試用例:

explain insert into tb_auto_increment(name)values('increment_01');

select * from tb_auto_increment;

explain select * from tb_auto_increment;

clip_image006

select last_insert_id();

explain select last_insert_id();

clip_image007

第二組測試用例:

explain insert into tb_auto_increment(name)values('increment_02');

select * from tb_auto_increment;

explain select * from tb_auto_increment;

clip_image008

select last_insert_id();

clip_image009

 

總結:最開始有一點小的疑問,在進行插入的時候,mycat會自動分配到配置的兩個數據庫上,但是在執行

explain select last_insert_id();

的時候,我們看到:

image

只會從一個庫中去查詢,但后來仔細一想也對啊,因為添加到兩個庫的數據是一致的,所以就沒有必要去每一個庫都去查詢了。當然,具體的還好去看源碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM