如何在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
相关产品推荐
相关产品推荐

