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

如何在MySQL中用复合键关联两个CSV文件的对应表?

MySQL双食材搭配表设计与CSV导入实操

一、复合主键方案完全可行

用Tb1的两个食材ID作为Tb2的复合主键是合理的设计,既能保证同一种食材组合不会重复存储,又能直接建立两张表的关联关系,完全匹配你的业务需求。

二、具体操作步骤

1. 创建Tb1(食材信息表)

先搭建基础食材表,用自增ID作为主键,方便后续关联:

CREATE TABLE Tb1 (
    ingredient_id INT AUTO_INCREMENT PRIMARY KEY,  -- 食材唯一ID,自动递增
    ingredient_name VARCHAR(100) NOT NULL,        -- 食材名称
    category VARCHAR(50) NULL                     -- 可选字段:食材分类(如蔬菜/肉类)
);

2. 创建Tb2(双食材搭配菜品表)

这里设置复合主键,同时给两个食材ID添加外键约束,确保只有Tb1中存在的食材才能被用来搭配菜品:

CREATE TABLE Tb2 (
    ingredient_id1 INT NOT NULL,
    ingredient_id2 INT NOT NULL,
    dish_name VARCHAR(100) NOT NULL,              -- 菜品名称
    dish_desc TEXT NULL,                          -- 可选字段:菜品描述
    -- 定义复合主键,确保同一种食材组合不重复
    PRIMARY KEY (ingredient_id1, ingredient_id2),
    -- 外键关联Tb1,保证食材ID的合法性
    FOREIGN KEY (ingredient_id1) REFERENCES Tb1(ingredient_id),
    FOREIGN KEY (ingredient_id2) REFERENCES Tb1(ingredient_id)
);

注意:如果不区分食材顺序(比如"番茄+鸡蛋"和"鸡蛋+番茄"算同一个菜品),导入CSV时要统一顺序(比如让ID数值小的在前),避免重复存储。

3. 准备CSV文件

  • Tb1的CSV示例(命名为ingredients.csv):

    ingredient_id,ingredient_name,category
    ,番茄,蔬菜
    ,鸡蛋,禽蛋
    ,牛肉,肉类
    

    注:ingredient_id列留空,MySQL会自动生成自增ID;如果自己指定ID,确保唯一即可。

  • Tb2的CSV示例(命名为dishes.csv):

    ingredient_id1,ingredient_id2,dish_name,dish_desc
    1,2,番茄炒蛋,经典家常菜
    1,3,番茄炖牛腩,酸甜浓郁
    

    注:这里的ID要和Tb1中生成的食材ID严格对应,确保存在。

4. 导入CSV到MySQL

如果你用命令行,可以用LOAD DATA语句:

-- 导入Tb1数据
LOAD DATA LOCAL INFILE '/path/to/ingredients.csv'
INTO TABLE Tb1
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;  -- 跳过CSV表头行

-- 导入Tb2数据
LOAD DATA LOCAL INFILE '/path/to/dishes.csv'
INTO TABLE Tb2
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

替换/path/to/为你的CSV实际存储路径;Windows系统路径用\\分隔。

如果用MySQL Workbench(可视化操作):

  • 右键Tb1 -> 选择Table Data Import Wizard
  • 选择对应的CSV文件,按向导提示匹配字段,完成导入
  • 重复上述操作导入Tb2的CSV

5. 验证关联与复合主键

  • 关联查询菜品和对应食材:
SELECT 
    t.dish_name,
    t1.ingredient_name AS 食材1,
    t2.ingredient_name AS 食材2
FROM Tb2 t
JOIN Tb1 t1 ON t.ingredient_id1 = t1.ingredient_id
JOIN Tb1 t2 ON t.ingredient_id2 = t2.ingredient_id;
  • 测试复合主键唯一性:尝试插入相同的ingredient_id1和ingredient_id2组合,MySQL会报错,说明复合主键已生效。

内容的提问来源于stack exchange,提问作者O Pai já vai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:36:06