MySQL Autoincrement InnoDB就像MyISAM一样

时间:2011-06-17 13:35:13

标签: mysql innodb myisam auto-increment

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

所以逻辑是当id保持不变时,直到出现重复键,在这种情况下(MyISAM)将增加id。

但是当我尝试在InnoDB中使用它时 - 不起作用。是否有解决方法(因为我需要交易)?

感谢。

从2003年10月23日晚上8:41发表的[姓名版主]发表的MySQL手册可能是更好的例子

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 个答案:

答案 0 :(得分:2)

  

但是当我尝试在InnoDB中使用它时 - 不起作用。有解决方法(因为我需要交易)?

您可以使用advisory locks和触发器解决问题。

identical question for PostgreSQL。您将要编写相同的MySQL版本。

答案 1 :(得分:0)

这将有效:

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更复杂的数据模型。