2017-06-19 7 views
1

eine Tabelle mit einem Feld gegeben, die einen Standardwert hat, sagen wie something hier:MySQL von Java: einen Standardwert Einfügen eines PreparedStatement INSERT-Abfrage-Parameter mit

CREATE TABLE foo (
    time DATETIME PRIMARY KEY, 
    something CHAR (16) DEFAULT 'a default', 
); 

... und eine vorbereitete Anweisung wie folgt aus :

INSERT INTO foo (time, something) VALUES (?, ?) 

Wie entscheidet man dann den Standardwert von something einfügen?

Ich weiß, ich kann es bekommen, indem Sie das Feld weglassen. In meinem Fall möchte ich jedoch in derselben Abfrage den Wert in einigen Datensätzen festlegen und auf die Datenbank verschieben, um das einzufügen, was in anderen als Standardwert konfiguriert ist.

Hier ist ein Beispiel-Code-Snippet:

String sql = "INSERT INTO foo (time, s1, s2, s3, ...) VALUES (?, ?, ?, ?, ...)"; 
// Many fields. You get the picture. 

PreparedStatement stmt = connection.prepareStatement(sql); 
connection.setAutoCommit(false); 

// Insert the lines. The number of fields can change from one line to 
// the next, depending on the sensors fitted at the time. The mapping 
// of fields -> database values is defined by the enum Fields. 
Field badField = null; 
try { 
    for(String line: loglines) { 

     String loggedSensors[] = line.toString().split (","); 
     for(Field field : Field.values()) { 
      if (field.parseIndex >= loggedSensors.length) { 
       log.warning("using default value for absent field" + 
        field.columnName); 
       // Omitting the field generates an error. 
       // How do we set the field to a default here? 
       continue; 
      } 
      badField = field; 
      stmt.setObject(
       field.ordinal()+1, 
       field.parse(loggedSensors[field.parseIndex])); 
     } 
     stmt.addBatch(); 
     stmt.executeBatch(); 
    } 
} catch (Exception e) { 
    log.error("error inserting field "+badField, e); 
    return; 
} 
connection.commit(); 

Ich habe hier die Dokumentation gegoogelt und kontrolliert, ohne etwas zu finden, die diese für MySQL speziell antwortet:

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference.html

+1

Warum verwenden Sie keine Bedingung? –

+0

@YCF_L: Können Sie das näher ausführen? –

+0

ich meine 'if () {// Standard verwenden} else {// den neuen Wert einfügen}', können Sie bitte etwas Code teilen, damit wir es verstehen können? –

Antwort

0

Eine praktikable Lösung scheint zu sein, die Abfrage zu erstellen, um die Funktionen COALESCE() und von MySQL zu verwenden, um Nullen in Standardwerte zu mappen. So schreiben die Beispiel INSERT-Abfrage wie folgt aus:

INSERT INTO foo (time, something) VALUES (?, COALESCE(?, DEFAULT(something))) 

Dann, wenn wir null in den zweiten Parameter einfügen, wird es stattdessen legen Sie die Standardeinstellung (die natürlich kann auch null sein):

// ... 
    for(Field field : Field.values()) { 
     if (field.parseIndex >= loggedSensors.length) { 
      // MySQL permits setting null like this, other DBs may 
      // require #setNull(int, int) 
      stmt.setObject(field.ordinal()+1, null); 
     else 
      stmt.setObject(
       field.ordinal()+1, 
       field.parse(loggedSensors[field.parseIndex])); 
    } 
// ... 

Kann für beliebig viele Felder verallgemeinert werden. Beachten Sie, dass das Feld mit dem Namen einen Standard definiert haben muss oder dass es einen Fehler geben wird, auch wenn der Standardwert nicht verwendet wird.

-1

nicht spezifizieren Sie Das Feld in der INSERT-Anweisung und der Standardwert werden verwendet.

INSERT in foo (Zeit) WERTE (?);

+2

OP schrieb: "Ich weiß, ich kann es bekommen, indem ich das Feld auslasse." –

Verwandte Themen