說明: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();
- 測試結果
- 修改表
ALTER TABLE t_auto_increment MODIFY id int auto_increment; DESC t_auto_increment;
- 添加測試
INSERT INTO t_auto_increment(name) VALUES('auto_02'); SELECT LAST_INSERT_ID();
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" />
3) mycat對應sequence_db_conf.properties增加相應設置
# blow tables add by yzp 2016.03.10
TB_AUTO_INCREMENT=dn1
注:這里的TB_AUTO_INCREMENT一定要大寫,我最開始的時候用小寫一直報下面的錯誤:
意思是說配置的時候沒有找到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);
當前值為100,步長為1
測試使用:
第一組測試用例:
explain insert into tb_auto_increment(name)values('increment_01'); select * from tb_auto_increment; explain select * from tb_auto_increment;
select last_insert_id(); explain select last_insert_id();
第二組測試用例:
explain insert into tb_auto_increment(name)values('increment_02'); select * from tb_auto_increment; explain select * from tb_auto_increment;
select last_insert_id();
總結:最開始有一點小的疑問,在進行插入的時候,mycat會自動分配到配置的兩個數據庫上,但是在執行
explain select last_insert_id();
的時候,我們看到:
只會從一個庫中去查詢,但后來仔細一想也對啊,因為添加到兩個庫的數據是一致的,所以就沒有必要去每一個庫都去查詢了。當然,具體的還好去看源碼。