Mysql 如何为每个客户ID设置单独的订单ID?

Mysql 如何为每个客户ID设置单独的订单ID?,mysql,data-modeling,Mysql,Data Modeling,设想一个数据库设置,x个客户可以在其中下y个订单。 通常,所有客户将共享一组自动递增的订单ID 客户A的第一个订单的订单id为1 客户B的第一个订单的订单id为2。 我想为每个客户提供一套单独的订单ID。重要的是,客户不能根据id看到有多少其他客户已经下了订单 客户A的第一个订单的订单id为1 客户A的第二个订单的订单id为2 客户B的第一个订单的订单id为1 现在,我能看到的唯一方法是手动选择客户订单号的最大值,添加+1,然后手动插入 select max(customer_order_id)

设想一个数据库设置,x个客户可以在其中下y个订单。 通常,所有客户将共享一组自动递增的订单ID

客户A的第一个订单的订单id为1 客户B的第一个订单的订单id为2。 我想为每个客户提供一套单独的订单ID。重要的是,客户不能根据id看到有多少其他客户已经下了订单

客户A的第一个订单的订单id为1 客户A的第二个订单的订单id为2 客户B的第一个订单的订单id为1 现在,我能看到的唯一方法是手动选择客户订单号的最大值,添加+1,然后手动插入

select max(customer_order_id) from orders where customer_id = X
在数据完整性和规范化的意义上,我如何创建这种方法?比如对客户的单个订单ID进行某种自动增量

create table customers
(
  id int auto_increment primary key, 
  name varchar(255)
);

create table orders
(
  id int auto_increment primary key, 
  customer_id int
  customer_order_id int 
  foo varchar
  bar varchar
);

只需将订单号设置为客户号,后跟序列号即可。如果我是客户103985,我的第一个订单是103985-0001,第二个订单是103985-0002。规范化数据-按顺序分别存储客户编号和序列号。将它们组合起来显示。

听起来您想要一个基本的关系结构,或者只是一个slug字段来选择

因此,orders表可以具有对客户透明的自动增量id。根据您计划如何提供数据,您可以轻松地使用slug系统来组合userdata以找到正确的记录

例如,一个基于url的请求-somesite.com/orders/{user_id}/1将选择其中user id为登录用户,order slug为1。{user_id}可能存在或省略,具体取决于您选择授权查看页面的方式。所以管理员可以通过get变量进行查看,而非管理员必须根据此变量进行验证。。。但这可能离题了

或者,您可以使用varchar来处理订单id并组成一个完全不可解析的字符串。根据您的站点规模,这可能不是问题


您唯一关心的是用户B的订单id为100,您不想让他们知道之前还有99个订单吗?如果是这样,这里的任何答案都适用于您。

使用InnoDB优于MyISAM有几个优点,但是如果您使用的是MyISAM引擎,您可以拥有自动生成的复合主键

来自dev.mysql.com::

对于MyISAM和BDB表,可以在多列索引中的辅助列上指定自动增量。在这种情况下,自动增量列的生成值计算为MAXauto\u INCREMENT\u column+1,其中prefix=给定前缀。当您想要将数据放入有序的组中时,这非常有用

在您的情况下,可能是这样的:

CREATE TABLE customers
(
  id int auto_increment PRIMARY KEY, 
  name varchar(255)
);

CREATE TABLE orders
(
  customer_id int,
  customer_order_id int auto_increment,  
  ...
  PRIMARY KEY (customer_id, customer_order_id)
);

如果您希望InnoDB具有相同的功能,则必须使用触发器。

是的,非常感谢您的回复。不过我还有一个问题:我如何正确地为每个客户增加单独的序列,而不必在php中选择max并添加+1,然后插入它?您可以跟踪客户记录中的最后一个订单序列,但我认为最好选择max并添加一个。非常感谢您的回复。我只是希望每个客户都有一个干净、独立的订单编号序列1、2、3…100。我只是不知道如何正确地为每个客户增加单独的序列,而不选择max并在php中添加+1,然后插入它?