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