【问题标题】:MySQL Auto-Increment with several different user-input wordsMySQL Auto-Increment 与几个不同的用户输入词
【发布时间】:2015-08-26 03:22:39
【问题描述】:

我目前正在使用 MySQL InnoDB 数据库编写在 HTML + PHP 上的物种编目代码。

该代码允许用户输入动物数据并将其存储在数据库中以供进一步搜索 (ID(used for indexing),Specie, order, family, name - 这些是当前数据库中的字段)。

其中一个要求是每只动物都有一个唯一的代码,前两个单词由用户定义。

EG:
TES/DES.01<br>
Format:
str/str.int

这是我卡住的地方,前两个词必须由用户设计,整数应该是基于先前结果的自动增量字段,因为会有多个具有相同前缀的动物并且不同唯一代码将是整数。 例如:

TES/DES.01<br>
TES/DES.01<br>
RUN/MAL.01(There will be multiple different prefixes, and they will grow as long the users keep adding more)<br>

运行/MAL.02 ...等等

我的第一个想法是为每个新前缀克隆表模式,然后将前缀与 ID 字段连接以进行索引,但这在我当前的硬件结构上效率极低(即使在良好的硬件中也可能效率低下?)。

我怎样才能做到这一点?

感谢您的帮助。

【问题讨论】:

    标签: php mysql database innodb auto-increment


    【解决方案1】:

    您想要一个由两部分组成的PRIMARY KEY,其中第二部分是AUTO_INCREMENT,它会在第一部分的每次更改时重置?这在 MyISAM 中直接可用,但在 InnoDB 中不可用。

    可以模拟。

    CREATE TABLE ... (
        part1 ...,
        part2 TINYINT ZEROFILL UNSIGNED NOT NULL,
        ...
        PRIMARY KEY(part1, part2),
    ) ENGINE=InnoDB;
    
    -- Insert a new row:
    BEGIN;
        SELECT @num := MAX(part2) FROM .. WHERE part1 = '...' FOR UPDATE;
        INSERT INTO ... ('RUN/MAL', IFNULL(@num+1, 1), ...);
    COMMIT;
    
    -- Get the string you really want:
    SELECT ... CONCAT(part1, '.', part2) ...
    

    【讨论】:

    • 或者有问题的前缀可以是另一个表的fk,看到记录可以共享它。那么就不需要模拟任何东西,一切都适合我们漂亮、常规、正常的设计。
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2021-01-28
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多