2016-08-22 2 views
3

I „kann keinen NULL-Wert annehmen“ Ich versuche Rekord in Derby Datenbank einzufügen mit Auto-Schlüssel generiert und ich erhalte diese Störung:Versuch ID einfügen und bekommen

Exception in thread "main" java.sql.SQLIntegrityConstraintViolationException: Column 'CUSTOMERID' cannot accept a NULL value. at org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) at org.apache.derby.client.am.ClientPreparedStatement.executeUpdate(Unknown Source) at jakub.ordereditor.OrderEditorMain.create(OrderEditorMain.java:54) at jakub.ordereditor.OrderEditorMain.main(OrderEditorMain.java:39) Caused by: ERROR 23502: Column 'CUSTOMERID' cannot accept a NULL value. at org.apache.derby.client.am.ClientStatement.completeExecute(Unknown Source) at org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(Unknown Source) at org.apache.derby.client.net.NetStatementReply.readExecute(Unknown Source) at org.apache.derby.client.net.StatementReply.readExecute(Unknown Source) at org.apache.derby.client.net.NetPreparedStatement.readExecute_(Unknown Source) at org.apache.derby.client.am.ClientPreparedStatement.readExecute(Unknown Source) at org.apache.derby.client.am.ClientPreparedStatement.flowExecute(Unknown Source) at org.apache.derby.client.am.ClientPreparedStatement.executeUpdateX(Unknown Source) ... 3 more

folgte ich diese Antwort: https://stackoverflow.com/a/1915197 und viele andere. Mein Stück Code:

package jan.ordereditor; 

import jan.ordereditor.customer.entity.Customer; 
import jan.ordereditor.customer.entity.CustomerName; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 


public class OrderEditorMain { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws SQLException { 

     Customer customer = new Customer(); 

     CustomerName customerFullName = new CustomerName(); 
     customerFullName.setCustomerFirstName("John"); 
     customerFullName.setCustomerSurname("Doe"); 

     customer.setCustomerFullName(customerFullName); 

     create(customer); 

    } 

    public static void create(Customer customer) throws SQLException { 
     String SQL_INSERT = "INSERT INTO customer (customerFirstName, customerSurname) VALUES (?,?)"; 
     try (
       Connection connection = DriverManager.getConnection("jdbc:derby://localhost:1527/OrderEditor"); 
       PreparedStatement statement = connection.prepareStatement(SQL_INSERT, 
         Statement.RETURN_GENERATED_KEYS);) { 
      CustomerName customerFullName = customer.getCustomerFullName(); 
      statement.setString(1, customerFullName.getCustomerFirstName()); 
      statement.setString(2, customerFullName.getCustomerSurname()); 


      int affectedRows = statement.executeUpdate(); 

      if (affectedRows == 0) { 
       throw new SQLException("Creating user failed, no rows affected."); 
      } 

      try (ResultSet generatedKeys = statement.getGeneratedKeys()) { 
       if (generatedKeys.next()) { 
        customer.setCustomerId(generatedKeys.getInt(1)); 
       } else { 
        throw new SQLException("Creating user failed, no ID obtained."); 
       } 
      } 
     } 
    } 

} 

und meine DB-ID in der Datenbank Derby:

enter image description here

+0

Machen Sie ID auto_increment oder fügen Sie es in die Insert-Anweisung – Jens

+0

machen Ihre ID erhöht werden, um auto_increment und nicht null. –

+1

'ID INTEGER NOT NULL ERZEUGT ALS IDENTITY (START MIT 1, INCREMENT BY 1)' ist diese Aussage in Ihrer DDL vorhanden? – Imran

Antwort

1

Sie müssen entfernen und readd die customerid Spalte in der Tabelle als Identitätsspalte .

Beispiel:

ALTER TABLE TableName add customerid int identity(1,1) 

beginnend mit 1, An jedem Einsatz, Wert wird um 1