2011-06-17 45 views
1

MyISAM允許非常方便的創建連續數據。 例如在該表中的主鍵是ID + SEQ(-uence)MySQL自動增量InnoDB像MyISAM

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的)將遞增編號。

但是,當我嘗試在InnoDB中使用它 - 不起作用。有沒有解決方法(因爲我需要交易)?

謝謝。

可能是從評論帖由[未公佈姓名]的MySQL手冊更好的例子,在2003年10月23日下午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 | 
+----+-----------+----------+-------+ 
+0

我假設你說的是主鍵複合時MyISAM的功能。如果是這樣的話,不需要 - InnoDB沒有這種功能。解決方法 - 消除auto_increment,編寫自己的計算密鑰的過程 - 基本上,一個巨大的麻煩。 – 2011-06-17 13:39:13

回答

2

但是當我嘗試在InnoDB中使用它 - 不工作。有沒有解決方法(因爲我需要交易)?

您可以使用advisory locks和觸發器解決此問題。

看到這個identical question for PostgreSQL。你會想編寫相同的MySQL版本。

+0

謝謝,但我需要將事務插入近20個表(xml相鄰映射) - 所以我需要儘可能簡化事務管理。 – 2011-06-17 13:44:49

+0

那麼,一個更簡單的方法就是根據需要鎖定你的桌子。但它會變慢。 – 2011-06-17 13:47:20

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更復雜。