You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现transfer表单主键transmittal_id对应多行数据连续录入

方案说明

当前transfer表的初始结构存在设计缺陷:将transmittal_id设为单主键时,同一主键值仅能对应唯一一行记录,无法实现单个传输单关联多条产品明细的一对多需求。
注意:同一传输单下其余行transmittal_id留空仅属于前端录入、结果展示层的交互效果,绝对不能将空值存入数据库关联字段,否则会彻底丢失明细与传输单的绑定关系,后续查询、统计逻辑全部会出错。

表结构修正

要实现一对多关联,需要调整主键规则,两种可选方案:

  • 方案1:使用联合主键,适合业务上同一传输单不会重复录入同款产品的场景
CREATE TABLE transfer (
  transmittal_id INT NOT NULL COMMENT '传输单ID',
  product_id INT NOT NULL COMMENT '产品ID(外键)',
  product_name VARCHAR(255) NOT NULL COMMENT '产品名称',
  product_quantity INT NOT NULL COMMENT '产品数量',
  PRIMARY KEY (transmittal_id, product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 方案2:新增独立明细主键,适合业务上允许同一传输单重复录入同款产品的场景
CREATE TABLE transfer (
  detail_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '明细行自增主键',
  transmittal_id INT NOT NULL COMMENT '传输单ID',
  product_id INT NOT NULL COMMENT '产品ID(外键)',
  product_name VARCHAR(255) NOT NULL COMMENT '产品名称',
  product_quantity INT NOT NULL COMMENT '产品数量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

两种方案中transmittal_id字段都必须设置为非空,禁止存储空值。


数据写入逻辑

你提到的transmittal_id=1对应的5条产品明细,数据库存储时所有行的transmittal_id都要赋值为1,插入语句参考:

INSERT INTO transfer (transmittal_id, product_id, product_name, product_quantity)
VALUES
(1, 220526, 'APCEE', 100),
(1, 220524, 'LAGUNDI', 100),
(1, 220529, 'TOVIT', 100),
(1, 220601, 'BETTER C', 100),
(1, 220605, 'ZINC VITA', 100);

交互层实现留空显示效果

你需要的“仅第一行显示传输单ID、其余关联行留空”的效果,在前端交互层实现即可,不需要修改数据库存储逻辑:

  • 录入场景:用户首次输入transmittal_id后,后续新增的明细行自动继承该ID,输入框视觉上留空即可,提交到后端时所有行必须携带对应的传输单ID
  • 展示场景:查询结果按transmittal_id排序,渲染表格时如果当前行的transmittal_id和上一行一致,就将该单元格渲染为空,即可达到预期显示效果。

数据库中存储的原始查询结果如下:

transmittal_idproduct_idproduct_nameproduct_quantity
1220526APCEE100
1220524LAGUNDI100
1220529TOVIT100
1220601BETTER C100
1220605ZINC VITA100

内容的提问来源于stack exchange,提问作者user19162231

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 00:54:44