資料庫做分表之後,沒法使用簡單的 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_table_fields, 'engine=innodb default charset=utf8');
// 為 article_title表 生成 id
$this->insert('}', array('generator' => 'article_title', 'id' => 0));
// 為 article_content表 生成 id
$this->insert('}', 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
public static function generateartitletitleid()
public static function generateartitlecontentid()
}
yii2資料庫遷移
yii migrate create create test table 建立乙個資料庫遷移 yii migrate 提交所有的遷移 yii migrate m160623 034801 create test table 指定類名,提交乙個遷移 yii migrate down 還原最近一次遷移 ...
基礎YII2資料庫操作
注意 為了保持精度,從資料庫中取出的資料都被表示為字串,即使相應的資料庫列型別數值。當建立從乙個帶引數的sql乙個db命令,你應該總是使用繫結引數的方法來防止sql注入攻擊。引數繫結是通過預處理語句來實現。除了防止sql注入攻擊,也可通過一次準備sql語句和多次使用不同的引數執行它提高效能 yii ...
yii2 查詢資料庫語法
1 query0 imgroupuser find where gid 56680dfc60b215d62104a4d8 select user client id all ar2 query1 imgroupuser findall gid 56680dfc60b215d62104a4d8 ar3...