MySQL автоинкремент InnoDB, как MyISAM - PullRequest
1 голос
/ 17 июня 2011

MyISAM позволяет очень удобный способ создания сериалов.Например, в таблице первичным ключом является id + seq (-uence)

id seq
1  1  insert into table(seq) values(1),(2),(3),(1),(2),(1),(1),(2);
1  2
1  3
2  1
2  2
3  1
4  1
4  2

Таким образом, логика заключается в том, что когда идентификатор остается прежним, пока не появится дубликат ключа, в этом случае (MyISAM) будет увеличиваться идентификатор.

Но когда я пытаюсь использовать его в InnoDB - не работает.Есть ли обходной путь (потому что мне нужны транзакции)?

Спасибо.

Может быть лучшим примером из комментариев к Руководству по MySQL Опубликовано [имя не разглашается] 23 октября 2003 г. 8:41 вечера

create table location
(
    id bigint not null auto_increment, -- "serial" per 4.1
    longitude int,
    latitude int,
    place int,
    primary key(id, longitude, latitude, place)
);

insert into location (longitude, latitude, place)
values (0,0,0), (1,1,1), (2,2,2);

select * from foo;

+----+-----------+----------+-------+
| id | longitude | latitude | place |
+----+-----------+----------+-------+
|  1 |         0 |        0 |     0 |
|  2 |         1 |        1 |     1 |
|  3 |         2 |        2 |     2 |
+----+-----------+----------+-------+


drop table location;

create table location
(
    id bigint not null auto_increment, -- "serial" per 4.1
    longitude int,
    latitude int,
    place int,
    primary key(longitude, latitude, place, id)
);

insert into location (longitude, latitude, place)
values (0,0,0), (1,1,1), (2,2,2), (0,0,0);

select * from location order by id;

+----+-----------+----------+-------+
| id | longitude | latitude | place |
+----+-----------+----------+-------+
|  1 |         0 |        0 |     0 |
|  1 |         1 |        1 |     1 |
|  1 |         2 |        2 |     2 |
|  2 |         0 |        0 |     0 |
+----+-----------+----------+-------+

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Но когда я пытаюсь использовать его в InnoDB - не работает. Есть ли обходной путь (потому что мне нужны транзакции)?

Вы можете обойти это, используя консультативные блокировки и триггеры.

См. идентичный вопрос для PostgreSQL . Вы захотите написать ту же версию MySQL.

0 голосов
/ 17 июля 2012

Это будет работать:

create table location
(
    id bigint not null auto_increment,
    longitude int,
    latitude int,
    place int,
    primary key(longitude, latitude, place, id)
) ENGINE =myisam;

Но это не будет:

create table location
(
    id bigint not null auto_increment,
    longitude int,
    latitude int,
    place int,
    primary key(longitude, latitude, place, id)
) ENGINE =innodb;

, потому что:

Недостатки MyISAM

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

и

Недостатки InnoDB

Поскольку InnoDB должен заботиться о различных отношениях между таблицами, администратор базы данных и создатели схем должны уделять больше времени разработке моделей данных, которые являются более сложными, чем модели MyISAM.

...