【问题标题】:Java/Mysql Selecting Primary Key values from one table and Insert them to another table as Foreign KeysJava/Mysql 从一个表中选择主键值并将它们作为外键插入到另一个表中
【发布时间】:2019-12-25 13:37:47
【问题描述】:

我正在使用 Netbeans 中的 Swing 创建一个程序,它是 Java 中的汽车管理应用程序,并且我使用 Mysql 作为数据库,它将执行所有 CRUD 操作。我创建了一个包含 3 个不同表的数据库。

数据库架构

CREATE TABLE car_make(
  make_id INT NOT NULL AUTO_INCREMENT
  make VARCHAR(50)
  PRIMARY KEY(make_id)
)

CREATE TABLE car_model(
  model_id INT NOT NULL AUTO_INCREMENT
  model VARCHAR(50)
  fk_make_id INT
  PRIMARY KEY(model_id)
  FOREIGN KEY(fk_make_id) REFERENCES car_make(make_id)
)

CREATE TABLE car_attributes(
  car_attr_id INT NOT NULL AUTO_INCREMENT
  fk_make_id INT
  fk_model_id INT
  year INT
  body_type VARCHAR(50)
  mileage INT
  price DECIMAL(6,2)
  PRIMARY KEY(car_attr_id )
  FOREIGN KEY(fk_make_id)  REFERENCES car_make(make_id)
  FOREIGN KEY(fk_model_id) REFERENCES car_model(model_id )
);

car_make 表已经填充了我手动插入的所有汽车制造商,并且它们的 ID 是自动生成的。 car_model 表还填充了每个品牌的不同模型。

我还使用 Java Swing 在 netbeans 中创建了用户界面,用户在其中选择汽车的品牌,它会自动生成相应的型号、年份、里程等,并将所有这些数据插入到 car_attribute表。我的问题是,将汽车品牌和型号作为外键插入car_attribute 表的查询是什么。例如,如果用户选择 Make-BMW 和 Model-5 系列,我想将这两个 IDS 插入到第三个表中。

【问题讨论】:

  • fk_make_id 不应该在car_attributes 中,因为品牌已经可以通过模型确定,模型由fk_model_id 定义。拥有这两列可能会导致数据相互矛盾,例如帕萨特作为车型,宝马作为制造商而不是大众。
  • 用户如何选择型号(和制作)?我希望在您应该已经拥有 ID 的地方出现一些下拉菜单或类似内容?您可以在获取其他数据以填充下拉列表时同时获取 ID。那么它只是一个简单的INSERT INTO car_attributes (fk_model_id, ...) VALUES (<model ID>, ...):
  • 查询类似于insert into car_attributes(car_attr_id, fk_make_id,fk_model_id,year, body_type, mileage, price) values(car_attr_id_value,fk_make_id,.....) 但正如@sticky bit所说,汽车属性中的fk_make_id列不一定需要,因为它可以从fk_model_id派生
  • @stickybit 谢谢你的提示,是的,你是正确的,用户从一个 JCombobox 中选择品牌,并且该品牌的正确模型显示在另一个 JCombobox 上,并且这些值已经具有 ID。我不想将 IDS 填充到下拉列表中,因为有超过一千个型号 ID,只有按型号过滤的汽车品牌,我想将这些名称作为外键插入 car_attribute 表。

标签: java mysql sql


【解决方案1】:

当您想添加新车时会出现这种情况,因此 GUI 会向您显示 CAR_MAKEs 当您选择时,它会显示CAR_MODELs,然后您需要在arrayList 中STORE 获取数据的ID(car_makes OR car_models)并在查询时使用它用户提交

只是伪代码

int carMakesSelectedIndex = comboCarMakes.getSelectedIndex();    
int carModelsSelectedIndex = comboCarModels.getSelectedIndex();
PreparedStatement stmt=con.prepareStatement("insert into car_attributes values(?,?,?,?,?,?,?,?,?,?)");  
stmt.setInt(1,carAttribute); 
stmt.setInt(2,carMakesIdList.get( carMakesSelectedIndex  ) ); 
stmt.setInt(3,carMakesIdList.get( carModelsSelectedIndex ) ); 
stmt.setString(4,carYear );
// the same with other attribute

【讨论】:

  • 能否请你给我一个例子,告诉我如何使用 arrayList 来完成,如果不是要求太多的话。
  • 如您之前所说,首先填充 car[makes, model] 表,如果您向用户显示 car[makes, models] 通过正常查询获取此数据 =“SELECT * FROM car_makes” 和然后将其存储在 arrayList 中,如:ResultSet rs = stmt.executeQuery(query); while(rs.next()){ car​​MakesIdList.add( rs.getInt("make_id") ); /*在列表中存储 id*/ comboCarMakes.addItem( rs.getString("make ") ); /*add make into combo*/ } 你也可以看到myJavaProject 唯一的区别是连接SqlServer
  • 我创建了用于检索 car_makes 和模型的查询,还创建了将值插入数据库的查询,但在创建 ArrayList carMakesIdList 以存储 ID 时遇到问题在一个列表中。这是我到目前为止写的。 ArrayList 使IdList = new ArrayList(); for(int i = 0; i
  • 分享该部分的源代码,因为我对 VarNames 感到困惑
  • 嗨 Elshoussam,对于你写的第一个答案,你是如何想出获取 carMakesSelectedIndex 的 carMakesIdList 的。我认为这就是我直到现在才感到困惑的地方。您能否给我一个示例,说明如何创建 ArrayList 以获取汽车制造商和汽车型号的 ID。旁注,查询 query="SELECT * FROM car_makes" 位于一个类中,其中包含从数据库中获取数据的 JComboBox,而我的 INSERT 查询位于方法内的另一个类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多