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