Просто подумал, что я брошу это в:
function inArray(val, ary){
for(var i=0,l=ary.length; i<l; i++){
if(ary[i] === val){
return true;
}
}
return false;
}
function removeClassName(classNameS, fromElement){
var x = classNameS.split(/\s/), s = fromElement.className.split(/\s/), r = [];
for(var i=0,l=s.length; i<l; i++){
if(!iA(s[i], x))r.push(s[i]);
}
fromElement.className = r.join(' ');
}
function addClassName(classNameS, toElement){
var s = toElement.className.split(/\s/);
s.push(c); toElement.className = s.join(' ');
}
С PostgreSQL можно сделать это через ключевое слово ВОЗВРАТА:
INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield
Это возвратит значение "anyfield". "anyfield" может быть последовательностью или нет.
Для использования его с JDBC сделайте:
ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);
Не используйте SELECT currval('MySequence') - значение увеличивается при неудачных вставках.
Начиная с версии драйвера PostgreSQL JDBC 8.4-701 , PreparedStatement # getGeneratedKeys ()
, наконец, полностью функционально. Мы используем его в производстве почти год к нашему полному удовлетворению.
В «обычном JDBC» PreparedStatement
необходимо создать, как показано ниже, чтобы он возвращал ключи:
statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
Вы можете загрузить текущую версию драйвера JDBC здесь (которая стоит на данный момент еще 8.4-701).
Если Вы используете JDBC 3.0, то можно получить значение PK, как только Вы вставили его.
Вот статья, которая говорит о как: https://www.ibm.com/developerworks/java/library/j-jdbcnew /
Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
"(first_name, last_name) " +
"VALUES ('George', 'Orwell')",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
// Retrieve the auto generated key(s).
int key = rs.getInt(1);
}
Используйте последовательности в пост-ГРЭС для идентификационных столбцов:
INSERT mytable(myid) VALUES (nextval('MySequence'));
SELECT currval('MySequence');
currval возвратит текущее значение последовательности на той же сессии.
(В SQL MS, Вы использовали бы @@ идентификационные данные или SCOPE_IDENTITY ())
Последовательности в postgresql являются безопасной транзакцией. Таким образом, можно использовать
currval(sequence)
Возврат currval
значение последний раз получено nextval для этой последовательности на текущей сессии. (Об ошибке сообщают, если nextval никогда не называли для этой последовательности на этой сессии.) Замечают, что, потому что это возвращает локальное для сессии значение, оно дает предсказуемый ответ, даже если другие сессии выполняют nextval между тем.
См. документы API для java.sql. Оператор .
В основном, когда Вы звоните executeUpdate()
или executeQuery()
, используйте Statement.RETURN_GENERATED_KEYS
постоянный. Можно тогда звонить getGeneratedKeys
для получения автоматически сгенерированных ключей всех строк, созданных тем выполнением. (Принятие Вашего драйвера JDBC обеспечивает его.)
Это идет что-то вроде этого:
Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
Вот то, как я решил его, на основе ответов здесь:
Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT INTO \"TableName\"" +
"(\"Column1\", \"Column2\",\"Column3\",\"Column4\")" +
"VALUES ('value1',value2, 'value3', 'value4') RETURNING
\"TableName\".\"TableId\"";
PreparedStatement prpState = conn.prepareStatement(sql);
ResultSet rs = prpState.executeQuery();
if(rs.next()){
System.out.println(rs.getInt(1));
}