Yii2-数据库分表, id 统一生成方法


数据库做分表之后,没法使用简单的 auto_increment  id 来做 primary key,为了维持 id 在多个物理分表上的全局唯一,我们需要一种替代 auto_increment 方式的统一  id 生成方法。 所有的 id 都统一从这里生成,确保不同分表的 id 是全局唯一的。只要保证了不同物理分表的 id 是全局唯一的,我们就能很容易的在不同分表之间迁移数据,而不同担心 id 冲突。

这里我们采用 存储过程来为所有的表统一生成  id ,结构如下:


$sequence_table_fields = array(
    	'generator'   => 'VARCHAR(32) NOT NULL PRIMARY KEY', # id 生成器名称
    	'id' => 'BIGINT(32) UNSIGNED NOT NULL DEFAULT 0', # 生成器对应的 id
);

$this->createTable('{{sequence}}', $sequence_table_fields, 'ENGINE=InnoDB DEFAULT CHARSET=utf8');

// 为 article_title表 生成 id
$this->insert('{{sequence}}', array('generator' => 'article_title', 'id' => 0));

// 为 article_content表 生成 id
$this->insert('{{sequence}}', array('generator' => 'article_content', 'id' => 0));

// 存储过程,用于生成 id
$this->execute("
    CREATE PROCEDURE `p_sequence_id_gen`(generatorName varchar(32))
	BEGIN
	START TRANSACTION;
	UPDATE `sequence` SET `id` = LAST_INSERT_ID(`id` + 1) WHERE `generator` = generatorName;
	SELECT LAST_INSERT_ID();
	COMMIT;
    END
");

存储过程的调用,直接用于生成表id

class StoreProcedureHelper {

	private static function call_p_sequence_id_gen($generatorName){
		$command = Yii::app()->db->createCommand('call p_sequence_id_gen("'.$generatorName.'")');
		return $command->queryScalar();
	}

	public static function generateArtitleTitleId(){
		return self::call_p_sequence_id_gen('article_title');
	}

	public static function generateArtitleContentId(){
		return self::call_p_sequence_id_gen('article_content');
	}

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值