我正在尝试创建我希望成为五位整数的 MySql 列。我想从我的软件中使用的前两位数字和后三位从数据库生成。
示例:商店编号10
将比10000
,对于其他商店例如:商店编号将是10001
, , ...10002
20
20000
20001
20002
使 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....
正如评论中所建议的,请考虑这种方法。只需有 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 示例,但只需查找strlen和str_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
。