Как создать таблицу в MySQL с двумя полями auto_increment - PullRequest
0 голосов
/ 05 ноября 2010

Для проекта мы делаем дизайн базы данных на данный момент. Мы считаем, что мы должны использовать два поля 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'. auto_increment для pid должно быть 50000000, а auto_increment для iid должно быть 80000000

Мы хотим не разбивать его на 3 таблицы с отношениями master -> table.pid и master -> table.iid.

изменение таблицы не работает, причина /* SQL Error (1075): Incorrect table definition; there can be only one auto column and it must be defined as a key */

Возможно ли это или какую альтернативу вы рекомендуете?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2010

Я не до конца понимаю ваш вопрос, но вы можете использовать триггеры для сохранения значений ключей, таких как:

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;
0 голосов
/ 05 ноября 2010

Если вы не можете использовать два автоматических столбца, я думаю, вы должны перепроектировать свою базу данных. Что именно вам нужно?

...