Mysql自定义序列生成器(如oracle)

时间:2010-07-27 20:45:32

标签: mysql database oracle hibernate database-design

我希望每个表有两个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表用作序列生成器。

创建新实体:

  1. 将新条目插入logical_id_seq。
  2. 从logical_id_seq读取last_insert_id()。
  3. 使用上述值在表格中插入新行。
  4. 让我再给你一些关于logical_id和physical_id的上下文。我想设计一个时间旅行数据库,这意味着我想要给出任何时间戳(现在或过去)的数据库状态。所以,我有版本_start_date和version_end_date。

    请告诉我,我的序列生成器方法是否有副作用。

2 个答案:

答案 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注释要审核的持久类或其某些属性。对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录。然后,您可以毫不费力地检索和查询历史数据。