2013-08-26 18 views
11

Tôi có 80000 recodes mà cần phải chèn vào cơ sở dữ liệu đặc biệt là trong bảng: temp (ts, temp) temp là INT.Làm thế nào để chèn NULL trong mysql đặc biệt là INT dataType

Vấn đề là gần 20000 lần truy xuất là không, vì vậy tôi tự hỏi cách chèn NULL vào DB khi dataType là INT.

Tôi cố gắng này:

String val = null; 

//insert(ts, val) into temp 
String sql = "INSERT INTO temp" + "(val)" + " VALUES" + "('" + val + "')"; 
Statement st = (Statement) conn.createStatement(); 
count = st.executeUpdate(sql); 

may chèn là thất bại. In thông báo ngoại lệ:

Incorrect integer value: 'null' for column 'val' at row 1" 

Chúc ai đó có thể giúp tôi. Cảm ơn bạn.

+2

Xóa dấu ngoặc kép? –

+0

Chỉnh sửa. cảm ơn – Eric

Trả lời

13

Bạn nên sử dụng một PreparedStatement và sử dụng setNull(int, int):

String sql = "INSERT INTO temp(val) VALUES (?)"; 
PreparedStatement st = con.prepareStatement(sql); 
if (/* int value is not null */) { 
    st.setInt(1, value); 
} else { 
    set.setNull(1, Types.INTEGER); 
} 
count = st.executeUpdate(); 
+1

Cảm ơn rất nhiều. Trước khi bạn nói với tôi PrepardStatement, tôi không biết điều đó. Đó là câu trả lời cho câu hỏi của tôi. Từ API: void setNull (int parameterIndex, int sqlType) ném SQLException: đặt tham số được chỉ định thành SQL NULL. – Eric

0

Bạn nên dứt khoát CAST NULL như một INT

...VALUES(...CAST(NULL AS INT)

0

Nghe có vẻ như bạn đang gửi "vô giá trị" trong khi bạn nên gửi một int. Có lẽ thử một cái gì đó giống như

(val == null "": val)

1

Bạn nên xem xét sử dụng chuẩn bị phát biểu. Nếu bạn làm như vậy, bạn sẽ tìm thấy thông tin về cách xử lý các số trống here và các nơi khác.

Nếu bạn chắc chắn 100% giá trị val bạn được sạch sẽ và sẽ không gây ra SQL Injection (hiếm gặp, nhưng có thể), sau đó là "chuỗi xây dựng" cách tiếp cận nhu cầu sử dụng một cách rõ ràng null khi xác định giá trị:

String sql = "INSERT INTO temp (val) VALUES ("; 
if (val == null) { 
    sql += "null"; 
} else { 
    sql += val; 
} 
sql += ")"; 
+0

Cảm ơn bạn, bạn đã đúng. Tôi đi sai đường. Nếu giá trị là null, nó có nghĩa là bản ghi là null, thậm chí nó có dấu thời gian. Vì vậy, tôi cần phải giữ các bản ghi những gì không phải là null. – Eric

0

Tôi đã giải quyết được sự cố này. Các mã cập nhật như sau:

String sql= null; 
if(val.isEmpty()){ 
System.out.println(val); 
System.out.println("Insert ts: " + ts + " val: null"); 
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "NULL" + " , " + "'" + pointId + "'" + ")"; 
} 
else{ 
System.out.println("Insert ts: " + ts + " val: " + val); 
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "'" + val + "'" + ", " + "'" + pointId + "'" + ")"; 
} 

Statement st = (Statement) conn.createStatement(); //create the instances of statement 
count = st.executeUpdate(sql); 

Về cơ bản, nếu chèn rỗng vào cơ sở dữ liệu, chỉ cần chèn vào bảng (val) giá trị (NULL).

+1

đây là một giải pháp hoàn toàn hợp pháp (tho là có thể được rút ngắn một chút), quá xấu nó đã được downvoted mà không cần bất kỳ lời giải thích – svarog

2

Để thay thế cho câu trả lời Đánh dấu Rotteveel, bạn cũng có thể sử dụng PreparedStatement.setObject(int, Object, int).

Bạn chỉ định Loại SQL (Tham số thứ 3) và nếu đối tượng là rỗng, nó sẽ tự động chèn một giá trị rỗng. Nó nhanh hơn và dễ dàng hơn.

String sql = "INSERT INTO temp(val) VALUES (?)"; 
PreparedStatement st = con.prepareStatement(sql); 
st.setObject(1, value, Types.INTEGER); 
count = st.executeUpdate(); 
Các vấn đề liên quan