MySQL Как правильно вставить в несколько таблиц? - PullRequest
1 голос
/ 29 марта 2012

Если у меня есть входной файл, например:

US, P1, AgriZone, H, 1000, 1200, 1101, 1210
US, P2, ArgiZone, L, 120, 122, 345, 566
MX, Q4, FarmOne, H, 1120, 2200, 1111, 2345

И у меня есть следующие таблицы .

Таблицы вSQLFiddle

Моя проблема: Как правильно вставить эти записи в БД (учитывая, что одна строка попадает в несколько таблиц)?Как мне убедиться, что я добавляю только уникальные столбцы таблицы?Пример 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!

1 Ответ

1 голос
/ 29 марта 2012

Реализуйте ограничения в ваших таблицах БД

  • Например, FARM_TITLE в таблице фермы должен быть УНИКАЛЬНЫМ (невозможно вставить дважды «Аргизон»)

  • Используйте внешний ключ для связи таблиц друг с другом. Это гарантирует, что вы сможете восстановить ряд файла, как: США, P1, AgriZone, H, 1000, 1200, 1101, 1210 который был "разбит" на несколько таблиц

-Используйте транзакции: чтобы вы могли делать больше операторов вставки для большего количества таблиц. Если вставка не удалась, откат транзакции, чтобы у вас не было строки файла, "частично" вставленной в базу данных:

 try{
   con.setAutoCommit(false);
   //do the multiple queries

   con.commit()
}
catch(Exception e) {
   con.rollback();
}

Псевдокод со вставкой sql для строки: US, P1, AgriZone, H, 1000, 1200, 1101, 1210

Предполагается, что источник в США еще не находится в источнике таблицы, поэтому сначала добавьте источник:

  //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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...