MySlq創建定長字符串主鍵,使用觸發器
因為想讓目錄的主鍵整齊好用,所以使用定長的字符串做主鍵,在表為空和只有一個數據的時候LAST_INSERT_ID()方法獲取的值都是1,所以在觸發器裡做了判斷
drop table if exists tb_cate;
create table tb_cate(
id char(5) primary key DEFAULT '' COMMENT '目錄編號,5位數字,高位補0,從00001開始,每次遞增1,由序列和觸發器控制', www.2cto.com
type char(1) default 0 COMMENT '目錄類型,備用,可以設置共享目錄等',
name varchar(40) not null COMMENT '目錄名稱',
`describe` varchar(200) COMMENT '目錄描述',
code varchar(30) not null COMMENT '目錄完整編碼,例如0000100002,不包含自身',
parent char(5) COMMENT '上級目錄',
lev char(1) default 0 COMMENT '目錄等級,默認0級',
create_user int(10) default 0 COMMENT '目錄創建人,默認0為系統創建',
update_user int(10) default 0 COMMENT '目錄最後修改人,默認0為系統創建',
createtime datetime COMMENT '目錄創建時間',
updatetiem datetime COMMENT '目錄最後修改時間',
increc_id int unique auto_increment COMMENT '只為實現觸發器使用的字段,實體中不需要映射此字段'
);
delimiter // #必須有的
CREATE TRIGGER tb_cate_createid before insert ON tb_cate
FOR EACH ROW BEGIN
select count(increc_id) from tb_cate into @inid;#判斷表是否為空
if @inid=0 then www.2cto.com
set new.id = SUBSTRING(concat('00000',cast(LAST_INSERT_ID() as char)),(char_length(concat('00000',cast(LAST_INSERT_ID() as char)))-4));
else
set new.id = SUBSTRING(concat('00000',cast(LAST_INSERT_ID()+1 as char)),(char_length(concat('00000',cast(LAST_INSERT_ID()+1 as char)))-4));
end if;
END;
// delimiter ; #必須有的
#下面是第二種方法,第一種方法在Mysql Workbench中測試有問題,第二種方法沒有問題,都還沒有在java中測試
delimiter // #必須有的
CREATE TRIGGER tb_cate_createId before insert ON tb_cate
FOR EACH ROW BEGIN
select count(increc_id) from tb_cate into @inid;
if @inid=0 then www.2cto.com
set new.id = SUBSTRING(concat('00000000000000000000',cast(1 as char)),(char_length(concat('00000000000000000000',cast(1 as char)))-19));
else
select max(increc_id) from tb_cate into @maxid;
set new.id = SUBSTRING(concat('00000000000000000000',cast(@maxid+1 as char)),(char_length(concat('00000000000000000000',cast(@maxid+1 as char)))-19));
end if;
END;
// delimiter ; #必須有的