【发布时间】:2011-03-21 17:50:49
【问题描述】:
我有下表。
create table mytable(
physical_id int auto_increment,
logical_id int,
data varchar(20),
version_start_date datetime,
version_end_date datetime,
primary key(physical_id),
unique key(logical_id,version_start_date, version_end_date)
);
架构背后的想法是,我想跟踪对 通过检查每一行并找到任何特定日期的有效行 版本开始日期和版本结束日期。我希望我的逻辑 id 是 auto_increment,但是mysql只允许一个id为auto_increment。
所以,我想在创建新行时将logical_id 设置为physical_id。一世 我可以使用触发器来做到这一点。
delimiter $$
create trigger myTrigger before insert on mytable for each row begin set
new.logical_id = (select auto_increment from information_schema.tables
where table_schema = database() and table_name = 'mytable') ; end$$
delimiter ;
我检查过的其他选项很少,http://feedblog.org/2007/06/20/portable-sequence-generation-with-mysql/ 和 http://www.redhat.com/docs/en-US/JBoss_Hibernate/3.2.4.sp01.cp03/html/Reference_Guide/Native_SQL-Custom_SQL_for_create_update_and_delete.html
这些方法的问题是,我必须创建一个新的序列表并不断向该表中插入一条记录。
有更好的选择吗?
谢谢
巴拉
-- Update
我不知道为什么@tpdi,为什么我需要父母,什么时候我可以用下表来模拟它。
create table logical_id_seq (
logical_id int auto_increment,
primary key(logical_id)
);
create table mytable (
physical_id int auto_increment,
logical_id int not null references parent(logical_id),
data varchar(20),
version_start_date datetime not null,
version_end_date datetime not null,
primary key(physical_id),
foreign key (logical_id) references logical_id_seq(logical_id),
unique key (logical_id,version_start_date,version_end_date)
);
【问题讨论】:
标签: database database-design mysql