Mysql автоинкремент альтернативы - PullRequest
0 голосов
/ 27 июля 2010

У меня есть таблица ниже.

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)
);

Ответы [ 4 ]

1 голос
/ 27 июля 2010

Именно поэтому я предпочитаю последовательности Oracle / PostgreSQL для MySQL auto_increment и IDENTITY SQL Server - для этого вы можете определить несколько последовательностей.

Создание отдельной таблицы исключительно для столбца для использованияauto_increment для дополнительного auto_increment - лучшее решение, о котором я могу подумать, к которому можно получить доступ через триггер или хранимую процедуру.

0 голосов
/ 27 июля 2010
create table parent (
  logical_id int auto_increment,
  physical_id int null references mytable(id)
);


create table mytable(
  physical_id int auto_increment,
  logical_id not null references parent(logical_id),
  data varchar(20),
  version_start_date datetime,
  version_end_date datetime,
  primary key(physical_id)
);

Чтобы вставить новый экземпляр существующей записи, вставьте в mytable ...., затем перехватите новый mytable.id и обновите физический_идентификатор родителя (возможно, в триггере).

Теперь, чтобы найти текущую запись, найдите логический идентификатор в parent и используйте parent.physical_id, чтобы присоединиться к правильной записи в «mytable»

Parent указывает на текущую действительную запись (из всех записей)в "mytable".

Чтобы найти все экземпляры логической записи, используйте логический_ид в "mytable".

Чтобы вставить полностью новую запись, сначала вставьте в parent, чтобы получить новый логический_идентификатор, затем вставьте данные в «mytable»;Вот почему мы допускаем, чтобы parent.physical_id обнулялся.

Что касается обновления OP: да, вы можете «эмулировать», просто «украдя» последовательность, но это не моделирует то, что происходит на самом деле.«Кража» последовательности - это просто деталь реализации;наличие двух таблиц, как я показал выше, ясно показывает, что происходит на самом деле, а именно: у меня есть текущее состояние (на которое указывает родитель) в «mytable» и 0, 1 или много предыдущих состояний в «mytable».Это более четкое разделение проблем, таблица, которая сообщает вам «что является текущим для любого идентификатора», и таблица, которая сообщает вам «данные этого текущего состояния и данные предыдущих состояний».

0 голосов
/ 27 июля 2010

Теперь я понимаю вашу проблему :). Меняя мой ответ.

Вам нужно будет использовать какой-то триггер, чтобы при редактировании какой-либо строки логический идентификатор увеличивался на 1, находя в таблице максимальное количество логических идентификаторов.

0 голосов
/ 27 июля 2010

Почему вы не хотите иметь таблицу с текущей версией, а затем дополнительную таблицу для истории? Затем вы используете вставку в таблицу текущей версии для генерации своего идентификатора и запрашиваете таблицу истории только тогда, когда вам действительно нужна информация истории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...