function reg($email){
$email = mysql_escape_string( $email); //用户名是E-mail
$crc32 = sprintf("%u", crc32( $email)); //散列计算表名
$mod = $crc32 % 5 + 1; //散列至5个表.mid至少为1
$query = "SET @@auto_increment_increment=5,@@auto_increment_offset=$mod"; //关键,设置该表的mid起始位置和偏移值
db()->query( $query);
$query = "INSERT INTO member{$mod} SET email='$email'";
db()->query( $query);
$mid = db()->insertID();$query = "SET @@auto_increment_increment=1,@@auto_increment_offset=1"; //还原默认值
db()->query( $query);
创建表:create table member1 {mid, email, autoincrement=mid, unique=email};
create table member2 like member1;
create table member3 like member1;
create table member4 like member1;
create table member5 like member1;
这样执行下来,member1的mid值类似: 1,6,11,16...
member2的mid值类似: 2,7,12,17...这样做应该可行.但是如果以前只分了5个表,现在要分10个表,所有的数据就都乱了,不知是否有解决方案
执行完sql 可以通过这个函数 mysql_insert_id获取你要的.
呵呵,现在是不能先插入再获取ID的,如果先插入再获取ID,那就是所有用户都跑一个表里了
比如 [email protected] 这个用户现在在第一个表,用户ID是1
加表导数据后,按照散列 [email protected] 在第5个表了,但用户ID维持1不变按照老版的,查用户ID为1的信息会跑到第一个表查,但现在就不是这样,根据用户ID是确定不了在哪个表的
即在遍历原来的所有表,对每一条记录检查是否需要改变表,如需要则将该记录插入目的表并在原表中删除
你可以用原算法(当然分表数要是增加后的表数)获得表名;也可以通过id计算出新表名关键在于,为了保证 id 不会因插入而改变,你需要在执行插入操作前先执行
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"切,切!!!