You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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

火山引擎 最新活动