我希望每个表有两个auto_increment列,但是mysql只允许一个auto_increment列。所以,我尝试使用自己的表复制oracle序列。
这是架构。
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)
);
因此,logical_id_seq表用作序列生成器。
创建新实体:
让我再给你一些关于logical_id和physical_id的上下文。我想设计一个时间旅行数据库,这意味着我想要给出任何时间戳(现在或过去)的数据库状态。所以,我有版本_start_date和version_end_date。
请告诉我,我的序列生成器方法是否有副作用。
答案 0 :(得分:1)
根据你的桌子类型(IIRC,它是MyISAM和BDB),你可以使用一个聪明的技巧来自动增量。
create table component_core (
component_id int auto_increment,
primary key(component_id)
);
create table component_history (
component_id int not null,
version_id int auto_increment,
data varchar(20),
version_start_date datetime not null,
version_end_date datetime not null,
primary key(component_id,version_id)
);
在创建全新组件时插入component_core,然后在插入component_history时使用该自动增量ID作为component_id,并且对于每个不同的component_id,version_id autoincrement字段将从1开始向上编号。将更改插入component_history时,请使用原始component_id,但允许version_id正常自动增量。在这种情况下,auto_increment列的生成值计算为MAX(auto_increment_column)+ 1 WHERE component_id = given-component_id。
Insert a new component_core
Retrieve the last autoincremented value from component_core (1)
Insert a new component_history using the component_id from component_core
Insert a new component_history using the same component_id
Insert a new component_history using the same component_id
Insert a new component_core
Retrieve the last autoincremented value from component_core (2)
Insert a new component_history using the component_id from component_core
Insert a new component_history using the same component_id
表格现在包含
<强> component_core 强>
component_id
1
2
<强> component_history 强>
component_id version_id
1 1
1 2
1 3
2 1
2 2
不确定该技术是否有任何帮助,特别是因为它仅限于特定的表格类型(我相信它在MyISAM中有效,但你在MyISAM的交易控制上失败了)
修改强>
参考:http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html
答案 1 :(得分:0)
所以,我想跟踪对行的修改(...)
我建议您在实施自己的解决方案前先查看Hibernate Envers:
Envers项目旨在实现持久化课程的轻松审核/ 版本控制。您所要做的就是使用
@Audited
注释要审核的持久类或其某些属性。对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录。然后,您可以毫不费力地检索和查询历史数据。