如何将Movie表生成的MovieID关联至评分与时长表(Java导入CSV)
关联MovieID到评分和时长表的解决方案
看起来你已经用Java的LOAD DATA语句把三个CSV文件导入到数据库表中了,现在需要把Movies表中基于影片名称生成的MovieID关联到Ratings和时长表(我假设时长表名为Duration)。下面是一步步的实现方案:
1. 确保Movies表的影片名称唯一性
首先要保证Movies表中的影片名称是唯一的,这样关联时不会出现一对多的匹配错误。你可以给MovieName字段添加唯一约束:
ALTER TABLE Movies ADD CONSTRAINT unique_movie_name UNIQUE (MovieName);
如果导入的Movies.csv中有重复的影片名称,先去重处理后再执行这条语句。
2. 给Ratings和Duration表添加MovieID字段
接下来需要在评分表和时长表中新增存储关联ID的字段:
ALTER TABLE Ratings ADD COLUMN MovieID INT; ALTER TABLE Duration ADD COLUMN MovieID INT;
3. 通过UPDATE语句关联MovieID
利用SQL的JOIN操作,根据影片名称匹配Movies表中的MovieID,并更新到对应的表中:
关联到Ratings表
UPDATE Ratings r JOIN Movies m ON r.MovieName = m.MovieName SET r.MovieID = m.MovieID;
关联到Duration表
UPDATE Duration d JOIN Movies m ON d.MovieName = m.MovieName SET d.MovieID = m.MovieID;
处理名称匹配的潜在问题
如果影片名称存在大小写不一致、多余空格等情况,可以用LOWER()和TRIM()函数统一匹配规则:
UPDATE Ratings r JOIN Movies m ON LOWER(TRIM(r.MovieName)) = LOWER(TRIM(m.MovieName)) SET r.MovieID = m.MovieID;
4. 整合到Java代码中
你可以把这些SQL操作添加到现有的Java导入代码之后,完整示例如下:
// 假设你已经获取了数据库连接和Statement对象 Statement statement = connection.createStatement(); // 导入Movies表 String sqlMovie = "LOAD DATA LOCAL INFILE 'src/csv-files/Movies.csv' into table Movies FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' "; statement.execute(sqlMovie); // 导入Ratings表 String sqlRating = "LOAD DATA LOCAL INFILE 'src/csv-files/Ratings.csv' into table Ratings FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' "; statement.execute(sqlRating); // 导入Duration表 String sqlDuration = "LOAD DATA LOCAL INFILE 'src/csv-files/Duration.csv' into table Duration FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' "; statement.execute(sqlDuration); // 添加MovieID字段 statement.execute("ALTER TABLE Ratings ADD COLUMN MovieID INT;"); statement.execute("ALTER TABLE Duration ADD COLUMN MovieID INT;"); // 关联MovieID到Ratings String updateRatings = "UPDATE Ratings r JOIN Movies m ON r.MovieName = m.MovieName SET r.MovieID = m.MovieID;"; statement.execute(updateRatings); // 关联MovieID到Duration String updateDuration = "UPDATE Duration d JOIN Movies m ON d.MovieName = m.MovieName SET d.MovieID = m.MovieID;"; statement.execute(updateDuration); // 可选:添加外键约束,保证数据一致性 statement.execute("ALTER TABLE Ratings ADD FOREIGN KEY (MovieID) REFERENCES Movies(MovieID);"); statement.execute("ALTER TABLE Duration ADD FOREIGN KEY (MovieID) REFERENCES Movies(MovieID);"); // 关闭资源 statement.close(); connection.close();
5. 可选优化
- 如果之后不需要保留
MovieName字段在Ratings和Duration表中,可以执行ALTER TABLE Ratings DROP COLUMN MovieName;删除字段。 - 导入CSV时,可以直接在
LOAD DATA语句中指定忽略表头(如果CSV有表头的话),比如添加IGNORE 1 LINES:LOAD DATA LOCAL INFILE 'src/csv-files/Movies.csv' into table Movies FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' IGNORE 1 LINES;
内容的提问来源于stack exchange,提问作者arlan schouwstra




