文章出處:http://netkiller.github.io
我一個又一個想法使用uuid 替代 數字數列id
2. 序列id 有範圍限制,如果插入失敗,id仍然會+1操作,造成浪費,達到最大值後會比較麻煩
3.考慮索引開銷,是否會影響性能,我不清楚。我認為對于btree 平衡樹增加類a-z還有“-” 使得子樹數量增加,索引應該更快。
也聽聽你的看法?
uuid_test_insert 是負責插入的時候建立uuid())
uuid_test_update 是保護uuid字段不會被修改
使用觸發器是因為,我的主鍵 primary key (`id`) 想用 uuid。 default uuid() 不允許?
create table `test` (
`id` varchar(50) not null default uuid(),
`username` varchar(250) null default null,
`values` varchar(250) null default null ,
primary key (`id`)
)
engine=innodb;
-- --------------------------------------------------------
-- 主機: 192.168.2.1
-- 伺服器版本: 5.5.25-log - mysql community server (gpl)
-- 伺服器作業系統: linux
-- heidisql 版本: 8.0.0.4396
-- 文章出處:http://netkiller.github.io
/*!40101 set @old_character_set_client=@@character_set_client */;
/*!40101 set names utf8 */;
/*!40014 set @old_foreign_key_checks=@@foreign_key_checks, foreign_key_checks=0 */;
/*!40101 set @old_sql_mode=@@sql_mode, sql_mode='no_auto_value_on_zero' */;
-- 導出 表 test.uuid_test 結構
drop table if exists `uuid_test`;
create table if not exists `uuid_test` (
`uuid` varchar(36) not null,
`name` varchar(20) not null,
primary key (`uuid`)
) engine=innodb default charset=utf8 comment='uuid 測試';
-- 資料導出被取消選擇。
-- 文章出處:http://netkiller.github.io
-- 導出 觸發器 test.uuid_test_insert 結構
drop trigger if exists `uuid_test_insert`;
set @oldtmp_sql_mode=@@sql_mode, sql_mode='';
delimiter //
create trigger `uuid_test_insert` before insert on `uuid_test` for each row begin
if new.uuid is null or new.uuid = '' or length(new.uuid) != 36 then
set new.uuid=uuid();
end if;
end//
delimiter ;
set sql_mode=@oldtmp_sql_mode;
-- 導出 觸發器 test.uuid_test_update 結構
drop trigger if exists `uuid_test_update`;
create trigger `uuid_test_update` before update on `uuid_test` for each row begin
set new.uuid = old.uuid;
/*!40101 set sql_mode=ifnull(@old_sql_mode, '') */;
/*!40014 set foreign_key_checks=if(@old_foreign_key_checks is null, 1, @old_foreign_key_checks) */;
/*!40101 set character_set_client=@old_character_set_client */;