-
全局表 唯一表:
-
mysql> insert into company(name) values ('auto_test');
Query OK, 1 row affected (1.08 sec)
mysql> insert into company(name) values ('auto_test');
Query OK, 1 row affected (0.45 sec)
mysql> select * from company;
+----+--------------------+
| id | name |
+----+--------------------+
| 1 | this is 119:3307 |
| 9 | this is writeeeeee |
| 10 | auto test |
| 11 | auto test |
| 12 | auto test |
| 13 | auto test |
| 14 | auto test |
| 15 | terwrw |
| 16 | auto_test |
| 17 | auto_test |
+----+--------------------+
10 rows in set (0.16 sec)
-
####全局表和唯一表是可以直接插入的,不需要指定id,和单实例无差异
-
分片表:
-
mysql> show create table employee\G;
-
*************************** 1. row ***************************
-
Table: employee
-
Create Table: CREATE TABLE `employee` (
-
`id` int(11) NOT NULL AUTO_INCREMENT,
-
`name` varchar(20) DEFAULT NULL,
-
`sharding_id` int(11) NOT NULL,
-
PRIMARY KEY (`id`)
-
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1
-
1 row in set (0.19 sec)
mysql> insert into employee(id,name,sharding_id) values (next value for MYCATSEQ_EMPLOYEE,'zs2',10000); --插入第一条后
Query OK, 1 row affected (0.00 sec)
mysql> select * from MYCAT_SEQUENCE; ----起始值变为11,此时第一条id也为11=1+10
+---------------+---------------+-----------+
| name | current_value | increment |
+---------------+---------------+-----------+
| EMPLOYEE | 11 | 10 |
| GLOBAL | 1 | 10 |
| TRAVELRECORD | 1 | 10 |
| TT2 | 30 | 10 |
+---------------+---------------+-----------+
再连续插入9条,上面的数据不变,当插入到第10条时,即自增id>11+10 时,上面会变成
mysql> select * from MYCAT_SEQUENCE;
+---------------+---------------+-----------+
| name | current_value | increment |
+---------------+---------------+-----------+
| EMPLOYEE | 21 | 10 |
| GLOBAL | 1 | 10 |
| TRAVELRECORD | 1 | 10 |
| TT2 | 30 | 10 |
+---------------+---------------+-----------+
3 rows in set (0.00 sec)
mysql> select * from employee;
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
| 11 | zs2 | 10000 |
| 12 | zs2 | 10000 |
| 13 | zs2 | 10000 |
| 14 | zs2 | 10000 |
| 15 | zs2 | 10000 |
| 16 | zs2 | 10000 |
| 17 | zs2 | 10000 |
| 18 | zs2 | 10000 |
| 19 | zs2 | 10000 |
| 20 | zs2 | 10000 |
| 21 | zs2 | 10000 |
| 22 | zs2 | 10000 |
| 23 | zs2 | 10000 |
+----+------+-------------+
13 rows in set (0.00 sec)
如果自增id不是分表的依据字段,也可以以这种方式插入
mysql> insert into employee(name,sharding_id) values ('zs2',10000);
Query OK, 1 row affected (0.00 sec)
但是这种方式会出现问题:
-
mysql> insert into employee(name,sharding_id) values ('123',10000),('123',10000),('123',10010),('123',10010);
Query OK, 4 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from employee;
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
| 1 | 123 | 10010 |
| 2 | 123 | 10010 | --id在各自的分片上不冲突,但是合在一起会有重复,自增id不是全局的
| 1 | 123 | 10000 |
| 2 | 123 | 10000 |
+----+------+-------------+
解决办法:不要忽略主键id,使用next value for MYCATSEQ_EMPLOYEE替
如果自增id是分片表的依据字段,那也是不能省略的:
mysql> insert into travelrecord(name) values ('auto_test');
ERROR 1064 (HY000): bad insert sql (sharding column:ID not provided,INSERT INTO travelrecord (name)
VALUES ('auto_test')
-
<table name="travelrecord" primaryKey="ID" dataNode="dn1,dn2,dn3" autoIncrement="true" rule="auto-sharding-long" />
-
<table name="tt2" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
-
autoIncrement="true" rule="sharding-by-intfile" /> ###增加autoincrement属性
-
测试:
mysql> insert into travelrecord(name) values ('123'),('123'),('123');
Query OK, 1 row affected (0.63 sec)
mysql> insert into employee(name,sharding_id) values ('123',10000),('123',10000),('123',10010),('123',10010);
Query OK, 1 row affected (0.12 sec)
mysql> insert into tt2(nm) values (99),(100),(101),(102);
mysql> select * from employee;
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
| 91 | 123 | 10000 |
| 92 | 123 | 10000 |
| 93 | 123 | 10010 |
| 94 | 123 | 10010 |
+----+------+-------------+
4 rows in set (0.01 sec)
mysql> select * from travelrecord;
+----+------+
| id | name |
+----+------+
| 51 | 123 |
| 52 | 123 |
| 53 | 123 |
+----+------+
3 rows in set (0.01 sec)
mysql> select * from tt2;
+----+-----+
| id | nm |
+----+-----+
| 30 | 99 |
| 33 | 102 |
| 31 | 100 |
| 32 | 101 |
+----+-----+
4 rows in set (0.38 sec)
注意:mycat_sequence知识帮你获取非相同的主键id,如果你非要插入一个相同的主键id,但是处于不同的分片上,那是可以的!如:
mysql> insert into employee(id,name,sharding_id) values (91,'123',10010);
Query OK, 1 row affected (0.12 sec)
mysql> select * from employee;
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
| 91 | 123 | 10000 |
| 92 | 123 | 10000 |
| 93 | 123 | 10010 |
| 94 | 123 | 10010 |
| 91 | 123 | 10010 |
+----+------+-------------+
4 rows in set (0.01 sec)
总结如下:
最开始的id=current_value+increment,继续插入时如果id一直<第二次的current_value+increment,current_value不会变,直到自增id 超过,然后current_value变为current_value+increment,以此类推
参考:
http://www.cnblogs.com/raphael5200/p/5900007.html
<table name="employee" primarykey="ID" datanode="dn1,dn2"