如何实现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_id | product_id | product_name | product_quantity |
|---|---|---|---|
| 1 | 220526 | APCEE | 100 |
| 1 | 220524 | LAGUNDI | 100 |
| 1 | 220529 | TOVIT | 100 |
| 1 | 220601 | BETTER C | 100 |
| 1 | 220605 | ZINC VITA | 100 |
内容的提问来源于stack exchange,提问作者user19162231
相关产品推荐
相关产品推荐

