Обновление SQL не работает с целочисленным идентификатором

#java #database #h2

#java #База данных #h2

Вопрос:

Эта команда на сервере SQL

 UPDATE tbl SET name='Hi' WHERE id=''
  

работает, если ‘id’ задан как целое значение, но это не работает на H2.

Каким может быть решение?

Комментарии:

1. пожалуйста, предоставьте подробную информацию о схеме таблицы ur

2. Как вы выполняете обновление SQL через java?

3. @Philippe Billerot Пожалуйста, предоставьте более подробную информацию по вашему вопросу. Какое точное сообщение об ошибке вы получаете? Есть ли код ошибки? Какую СУБД вы используете? Сервер MySQL, MS SQL Server, Oracle?

4. @bakoyaro: H2 — это база данных en.wikipedia.org/wiki/H2_(DBMS)

5. @BalusC ваше «исправление» полностью изменило вопрос, я его отменю. Перед вашим исправлением: ID='' (где ясно, почему это не может сработать: пустую строку нельзя преобразовать в число); после вашего исправления: id=? (это параметр, и H2 не выдаст исключение).

Ответ №1:

Если идентификатор является целым числом, вы не должны использовать кавычки для значения:

 UPDATE TEST SET NAME='Hi' WHERE ID = 5; // not ID = '5'
  

Многие базы данных будут принимать указанную версию, но это не требуется спецификацией языка SQL.

Комментарии:

1. H2 также поддерживает ID = ‘5’, даже если ID является целым числом… проблема не в этом. Проблема в том, что пользователь использовал ID = «, который, похоже, поддерживается MySQL и (вероятно?) Oracle, но не с какой-либо другой базой данных, которую я тестировал (PostgreSQL, Derby, HSQLDB).

2. Я не удовлетворен, потому что запрос является результатом генератора команд SQL, которые не управляют типом данных. Спасибо.

Ответ №2:

UPDATE TEST SET NAME='Hi' WHERE ID='1'; это работает в sql Server, даже если поле id является целым числом, но если вы хотите обновить строку, где id равен null, тогда вам нужно использовать приведенную ниже инструкцию: UPDATE TEST SET NAME='Hi' WHERE ID is Null; вместо UPDATE TEST SET NAME='Hi' WHERE ID ='';

И если id равен varchar, то вы можете использовать свой оператор для обновления значений, где ID не равен null и данные там недоступны. Но если вы хотите обновить значения для записи, где в поле ID значение NULL, вам нужно использовать

UPDATE TEST SET NAME='Hi' WHERE ID is Null;

Комментарии:

1. 1: Некоторые базы данных считают » и null эквивалентными (чего они не должны)

2. Привет, Марк, может быть да для некоторой системы баз данных.

3. Я не удовлетворен, потому что запрос является результатом генератора команд SQL, которые не управляют типом данных. Спасибо.

Ответ №3:

H2 выдает исключение, поскольку не может преобразовать пустую строку '' в число. H2 внутренне использует, java.lang.Long.parseLong("") что приводит к сбою с java.lang.NumberFormatException: For input string: "" .

Для сценария SQL:

 drop table tbl;
create table tbl(id int primary key, name varchar(255));
insert into tbl values(1, 'Hello');
UPDATE tbl SET name='Hi' WHERE id='';
  

H2 вызовет исключение:

 Data conversion error converting  [22018-161]
  

Большинство других баз данных (PostgreSQL, Apache Derby, HSQLDB) выдают аналогичное исключение.

Вам нужно использовать число, или IS NULL как в:

 UPDATE tbl SET name='Hi' WHERE id IS NULL;
  

или

 UPDATE tbl SET name='Hi' WHERE id = 0;