2

我正在尝试创建我希望成为五位整数的 MySql 列。我想从我的软件中使用的前两位数字和后三位从数据库生成。

示例:商店编号10将比10000,对于其他商店例如:商店编号将是10001, , ...1000220200002000120002

4

2 回答 2

1

使 order_id 成为自动增量字段,然后在 store_id 和 order_id 上创建主键(按该顺序)。

这样,order_id 将为每个 store_id 单独计算。

请参阅此示例: http ://sqlfiddle.com/#!2/33b3e/1

完整代码:

CREATE TABLE order_ticket_number ( id_store_ticket int(10) NOT NULL,
                                  id_order_ticket int(10) AUTO_INCREMENT NOT NULL,
                                  id_order int(10) unsigned NOT NULL default 0, 
                                  PRIMARY KEY (id_store_ticket,id_order_ticket)

                                   )
ENGINE=myisam DEFAULT CHARSET=utf8;


INSERT INTO order_ticket_number (id_store_ticket) VALUES (10),(10),(20),(20);

编辑:这只能用 MyIsam 完成,(显然)不能用 InnoDB 完成。

所以我认为有两种选择。在您的应用程序逻辑中处理此问题,或者创建一个 MyIsam 表来处理编号。一旦你插入了那里,你就会知道 order_id 并且你可以将它插入到 InnoDB 表中。尽管这似乎不是最优雅的解决方案。我认为它比尝试自己生成它(比赛条件)更能证明错误。

您应该问自己的最后一件事是为什么要拥有这些数字。为什么不为每个订单使用简单的自动增量而不考虑 store_id....

于 2012-10-10T08:04:17.477 回答
0

正如评论中所建议的,请考虑这种方法。只需有 2 列,并通过 UNIQUE 绑定它们,因此没有冲突。如果您在 Store ID 10 中查找第一个 id,只需WHERE store_id = 10 AND other_id = 1. 它更合乎逻辑,您可以创建一个简单的函数将其输出为100001

function store_string($int_store_id, $int_other_id) {
    $str = str_repeat('0', (2 - strlen($int_store_id))).$int_store_id;
    $str .= str_repeat('0', (3 - strlen($int_other_id))).$int_other_id;
    return $str;
}

(PHP 示例,但只需查找strlenstr_repeat即可了解。

这为您提供了很多优势,例如更容易搜索任一值,以及store_id无需更改所有现有行和仅更改输出函数即可超过 99 的可能性。

关于实际INSERT,您可以像这样运行插入:

INSERT INTO table_name (store_id, other_id, third_value)
SELECT {$store_id}, (other_id + 1), {$third_value}
FROM (( SELECT other_id
        FROM table_name
        WHERE store_id = {$store_id}
        ORDER BY other_id DESC)
        UNION ALL
    (   SELECT '0')
        LIMIT 1) AS h

并且使用相同的方式简单地扩展更多值$third_value

于 2012-10-10T08:11:34.583 回答