2011-11-10 31 views
1

此命令在SQL Server上的工作SQL更新不是整數ID

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

作品如果「身份證」被設置爲一個整數值,但它不會對H2工作。

什麼可能是解決方案?

+2

烏爾表架構 – Ghostman

+0

的請提供詳細資料,你怎麼樣通過Java的SQL更新? –

+0

@Philippe Billerot請爲您的問題提供更多實質內容。什麼是您收到確切的錯誤信息?是否有錯誤代碼?你使用的是什麼DBMS? MySQL服務器,MS SQL Server,Oracle? – bakoyaro

回答

6

如果ID是整數,則不應使用引號值:

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

許多數據庫將接受報價的版本,但不是由SQL語言規範要求。

+0

即使ID是一個整數,H2也支持ID ='5'...這不是問題。問題在於用戶使用了ID ='',這似乎受MySQL和(可能?)Oracle支持,但不受我測試的任何其他數據庫(PostgreSQL,Derby,HSQLDB)的支持。 –

+0

我不滿意,因爲請求是不控制數據類型的SQL命令生成器的結果。 謝謝。 –

4

UPDATE TEST SET NAME='Hi' WHERE ID='1'; 是在SQL Server中工作,即使id字段是整數 但如果你想更新的行其中id爲空,那麼你必須使用下面的語句:的 UPDATE TEST SET NAME='Hi' WHERE ID is Null; 代替UPDATE TEST SET NAME='Hi' WHERE ID ='';

而且如果id是varchar,那麼您可以使用您的語句來更新ID不爲空的值,並且數據在那裏不可用。 但是如果你想在那裏ID字段的NULL值,那麼你必須使用

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

+0

+1:有些數據庫認爲''和null是等價的(他們不應該這樣做) –

+0

嗨馬克,對於某些數據庫系統可能是肯定的。 –

+0

我不滿意,因爲請求是不控制數據類型的SQL命令生成器的結果。 謝謝。 –

0

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;