2010-11-05 28 views
0

對於一個項目我們現在進行數據庫設計。我們認爲我們應該在一個表中使用兩個auto_increment字段。如何在mysql中設計一個帶有兩個auto_increment字段的表

,表主機:

`pid` int(10) NOT NULL auto_increment, 
`iid` int(10) NOT NULL auto_increment, 
... 

要開始一個替代auto_incremet可以使用ALTER TABLE tbl AUTO_INCREMENT = 100000;這將只爲整個表「TBL」。 pid的auto_increment應爲50000000,iid的auto_increment應爲80000000

我們希望避免將它與關係master - > table.pid和master - > table.iid分裂成3個表。

修改表是不工作的原因 /* SQL Error (1075): Incorrect table definition; there can be only one auto column and it must be defined as a key */

是否有可能還是你推薦什麼替代?

+0

你能上,爲什麼你需要兩個auto_incrementing場在同一個表詳細點嗎? – PatrikAkerstrand 2010-11-05 09:08:55

+0

我們在內部和我們的客戶討論了這個話題。我們的客戶希望依靠「有意義」的數字。解釋可能的風險並調查利弊,我們決定修改數據庫設計。這個想法源於使用Microsoft SQL Server的現有應用程序,其中已經實現了類似的功能。 – vbd 2010-11-05 10:01:39

回答

0

如果你不能使用兩個自動列,我認爲你必須重新設計你的數據庫。你需要什麼?

0

我不完全理解你的問題,但你可以使用觸發器來保持像鍵值如下:

drop table if exists grid; 
create table grid 
(
grid_id int unsigned not null auto_increment primary key, 
name varchar(255) not null, 
next_token_id int unsigned not null default 0, 
next_node_id int unsigned not null default 0 
) 
engine = innodb; 

drop table if exists grid_token; 
create table grid_token 
(
grid_id int unsigned not null, 
token_id int unsigned not null, 
name varchar(255) not null, 
primary key (grid_id, token_id) -- note clustered PK order (innodb only) 
) 
engine = innodb; 

drop table if exists grid_node; 
create table grid_node 
(
grid_id int unsigned not null, 
node_id int unsigned not null, 
name varchar(255) not null, 
primary key (grid_id, node_id) -- note clustered PK order (innodb only) 
) 
engine = innodb; 

-- TRIGGERS 

delimiter # 

create trigger grid_token_before_ins_trig before insert on grid_token 
for each row 
begin 

declare tid int unsigned default 0; 

    select next_token_id + 1 into tid from grid where grid_id = new.grid_id; 
    set new.token_id = tid; 
    update grid set next_token_id = tid where grid_id = new.grid_id; 

end# 

create trigger grid_node_before_ins_trig before insert on grid_node 
for each row 
begin 

declare nid int unsigned default 0; 

    select next_node_id + 1 into nid from grid where grid_id = new.grid_id; 
    set new.node_id = nid; 
    update grid set next_node_id = nid where grid_id = new.grid_id; 

end# 

delimiter ; 

-- TEST DATA 

insert into grid (name) values ('g1'),('g2'),('g3'); 

insert into grid_token (grid_id, name) values 
(1,'g1 t1'),(1,'g1 t2'),(1,'g1 t3'), 
(2,'g2 t1'), 
(3,'g3 t1'); 

insert into grid_node (grid_id, name) values 
(1,'g1 n1'),(1,'g1 n2'), 
(2,'g2 n1'), 
(3,'g3 n1'),(3,'g3 n2'); 

select * from grid; 
select * from grid_token; 
select * from grid_node; 
相關問題