如果我有一个输入文件,如:
US, P1, AgriZone, H, 1000, 1200, 1101, 1210
US, P2, ArgiZone, L, 120, 122, 345, 566
MX, Q4, FarmOne, H, 1120, 2200, 1111, 2345
我有以下表格。
我的问题:如何将这些记录正确插入数据库(考虑一行属于多个表)?如何确保我只添加唯一的表列?上面的示例Agrizone
只需要表Farm
中的一个条目?这样插入时的典型方法是什么?
try
{
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection(
"jdbc:mysql://" + this.getServer() + "/" + this.getDatabase(),
user, password);
Statement s1 = (Statement) con.createStatement();
s1.executeUpdate("INSERT INTO" ??);
con.close();
}
Catch(Exception blah)
如何管理此类插入,确保正确设置PK和FK?
非常感谢stackoverflow社区!
答案 0 :(得分:1)
对数据库表实施约束
例如,农场表中的FARM_TITLE应该是UNIQUE(不可能插入两次“Argizone”)
使用外键相互链接表。这保证您将能够重建文件的一行,如:US,P1,AgriZone,H,1000,1200,1101,11210 已被“拆分”为多个表格
- 使用事务:因此您可以在更多表上执行更多插入语句。如果插入失败,则回滚事务,以便您不会在db上插入“部分”文件的行:
try{
con.setAutoCommit(false);
//do the multiple queries
con.commit()
}
catch(Exception e) {
con.rollback();
}
包含行的sql插入的伪代码:US,P1,AgriZone,H,1000,1200,1101,1210
假设US是一个尚未出现在表格中的来源,所以首先插入原点:
//this is pseudo code that insert into db table and retreive the id inserted. ID shoul be primary key and autoincrement
int origin_id = execute( INSERT INTO ORIGIN(ORIGIN_NAME) values ("US");
//now we insert the P1 stock. Again STOCK_ID primary key auto inc
int stock_id = execute( INSERT INTO STOCK(ORIGIN_ID, STOCK_TITLE) values (origin_id, "P1");
//now fill table FARM
int farm_id = execute (INSERT INTO FARM(STOCK_ID, FARM_TITLE, SIZE, FARM_COMPNENTS) values (stock_id,"Agrizone","H","100");
//finally a cycle to insert in GATE suppose we have n entries in this case (1200, 1101, 1210). I image to have an array
for(int i =0; i<n; i++)
INSERT INTO GATE (FARM_ID, FARM_COMPONENTS) values (farm_id,value[i]);