【问题标题】:how to design a table in mysql with two auto_increment fields如何在mysql中设计一个带有两个auto_increment字段的表
【发布时间】:2011-05-05 12:12:52
【问题描述】:

对于一个项目,我们目前正在进行数据库设计。我们认为我们应该在一张表中使用两个 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

我们希望避免将其拆分为 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 */

有可能吗,或者你推荐什么替代方案?

【问题讨论】:

  • 您能否详细说明为什么需要在同一个表中使用两个 auto_incrementing 字段?
  • 我们在内部和我们的客户讨论了这个话题。我们的客户希望依靠“有意义的”数字。解释可能的风险并调查利弊,我们决定修改数据库设计。这个想法源于一个使用 Microsoft SQL Server 的现有应用程序,其中已经实现了类似的功能。

标签: mysql sql mysql-error-1075


【解决方案1】:

如果您不能使用两个自动列,我认为您必须重新设计您的数据库。你到底需要什么?

【讨论】:

    【解决方案2】:

    我不完全理解您的问题,但您可以使用触发器来维护关键值,如下所示:

    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;
    

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 2013-09-12
      • 1970-01-01
      • 2015-12-09
      • 2012-05-31
      • 2019-04-16
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多