У меня есть таблица ниже.
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)
);
Идея схемы заключается в том, что я хочу отслеживать изменения для каждой строки и находить действительную строку в любой конкретный день, проверяя version_start_date и version_end_date.,Я хочу, чтобы моим логическим идентификатором было auto_increment, но mysql допускает, чтобы только один идентификатор был auto_increment.
Итак, я хочу установить для логического_ идентификатора имя_физического при создании новой строки.Я могу сделать это с помощью триггера.
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)
);