1

У меня есть две таблицы, в которых первичный ключ (внешний ключ в другой таблице) автоматически увеличивается во время выполнения (используя TOAD для mysql). Как вставлять данные в две таблицы одновременно, используя транзакцию.Вставка данных с использованием автоинкрементного столбца в качестве первичного ключа

Это DDL для первой таблицы:

CREATE TABLE `suspendedsales` (
`SID` int(11) NOT NULL AUTO_INCREMENT, 
`SequenceNo` int(11) NOT NULL DEFAULT '0', 
`ProductCode` varchar(100) DEFAULT NULL, 
`ItemName` varchar(100) DEFAULT NULL, 
`Quantity` int(11) DEFAULT NULL, 
`Discount` double DEFAULT NULL, 
`ItemCost` double DEFAULT NULL, 
PRIMARY KEY (`SID`,`SequenceNo`), 
CONSTRAINT `SIDFKey` FOREIGN KEY (`SID`) REFERENCES `suspendedsalesdetails` (`SID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

DDL для второй таблицы:

CREATE TABLE `suspendedsalesdetails` (
`SID` int(11) NOT NULL DEFAULT '0', 
`Date` date DEFAULT NULL, 
`Total` double DEFAULT NULL, 
PRIMARY KEY (`SID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

NB: Основная задача будет получить автоинкрементное значение ключа из на первичный ключ, который будет вставлен в другую таблицу во время выполнения.

Спасибо в ожидании.

+0

я бы сказал, вы первый отключить автоматическое обязательство от жабы. – hzhsun

ответ

0

Если база данных представляют собой базу данных MySql вы можете вставить запись в первой таблице с помощью следующей функции

SELECT LAST_INSERT_ID(); 

, чтобы получить последний вставленный идентификатор и вы можете использовать его во второй вставке. Фиксировать все только после того, как второй вставки

+0

Иногда простой ответ является правильным. я изначально не рассматривал ваш ответ и потратил много времени на настройку прежнего кода. Бесконечно благодарен. Ты просто спас меня. NB: для тех, кто имеет эту же задачу, просто используйте last_insert_Id в качестве вашего значения в подготовленном операторе. –

0

Как об этом:

private void insert() { 

    OraclePreparedStatement statement = null; 


    try { 
     Connection dbConnection = getConnection(); 
     statement = dbConnection.createStatement(); 

     String insertToSuspendedsales = "insert into suspendedsales (SequenceNo, ProductCode,ItemName,Quantity,Discount,ItemCost) " 
      + "values(:segNo, :prodNo, :itmeName, :quantity, :discount, :itemCost) returning SID into ?"; 

     statement.setIntAtName("segNo", intValue); 
     .... 

     int id = statement.registerReturnParameter(1, OracleTypes.INTEGER) 
     statement.executeUpdate(insertToSuspendedsales); 

     String insertToSuspendedsalesdetails = "insert into suspendedsalesdetails (SID, Date, Total) " 
      + "values(:sid, :date, :total) returning SID into ?"; 


     statement.setIntAtName("sid", id); 
     .... 

     statement.executeUpdate(insertToSuspendedsalesdetails); 

    } catch (SQLException ex) { 
     ex.printStackTrace(); 
     //rollback 
    } finally { 

     //close Connection 
    } 
} 
+0

Кажется хорошим кодом. Не могли бы вы воспроизвести это с использованием базы данных mysql и подготовленных отчетов? –

Смежные вопросы