Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> У меня вопрос по SQL и DERBY, вставить строку в таблицу 
V
    Опции темы
Clio
Дата 30.1.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Добрый вечер. У меня вопрос по SQL и DERBY.
У меня есть таблица  SESSION_MODE, состоящая из 2 полей:

1) id SMALLINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY
2)mode VARCHAR(10) UNIQUE NOT NULL.

Мне, необходимо вставить в таблицу значени строки mode только , если  такой строки нет в таблице.
Mожно ли сделать этот запрос одной SQL-командой insert (я не силен в SQL).
Я делал так:
Цитата

String  selmode="SELECT id,mode FROM  SESSION_MODE WHERE mode=?";
            PreparedStatement prepareState =conn.prepareStatement(selmode, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE );
            prepareState.setString(1, SessionGeneral.mode);
            rs=prepareState.executeQuery();
            if(rs.first()){
               idMode= rs.getInt("id");
               System.out.println("id: "+idMode);
               System.out.println(rs.getString("mode"));
            }else{
                rs.moveToInsertRow();
                rs.updateString("mode", SessionGeneral.mode);
                rs.insertRow();
                idMode= rs.getInt("id");  // при первом значении idMode=0, но смотрю в базе там          
записано 1 , что я делаю неправильно
            }


PM MAIL   Вверх
ecologist
Дата 30.1.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



Как-то сложно придумано - нельзя ли просто сделать запрос на INSERT ? А то связываться с ResultSet.CONCUR_UPDATABLE - а вдруг драйвер такое не реализует ?

А еще вариант - сделать уникальный индекс на поле. И если такое уже есть, то будет exception, который можно ловить.

Это сообщение отредактировал(а) ecologist - 30.1.2009, 10:54
PM MAIL   Вверх
EJack
Дата 30.1.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



А не проще такая последовательность
Код

SELECT COUNT(*) FROM SESSION_MODE WHERE mode=?

и если кол-во рано 0 то 
Код

INSERT INTO ........


PM MAIL   Вверх
ecologist
Дата 30.1.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



Тут может быть одна проблема - если приложение многопользовательское, то без проверки на уникальность два пользователя могут одновременно вставить одинаковые числа. Сначала один проверит, узнает, что нет, потом второй тое проверит. А помто оба добавят. Фигня получится.
Лучше тогда индекс добавить и ловить экспешн.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0394 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.