code: public boolean createTableIfMissing (Connection conn, String table, List<String> columns,
                                           List<ColumnDefinition> definitions,
                                           List<List<String>> uniqueConstraintColumns,
                                           List<String> primaryKeyColumns)
          throws SQLException
      {
          if (tableExists(conn, table)) {
              return false;
          }
          if (columns.size() != definitions.size()) {
              throw new IllegalArgumentException("Column name and definition number mismatch");
          }
  
          StringBuilder builder = new StringBuilder("CREATE TABLE ").
              append(tableSQL(table)).append(" (");
          for (int ii = 0; ii < columns.size(); ii ++) {
              if (ii > 0) {
                  builder.append(", ");
              }
              builder.append(columnSQL(columns.get(ii))).append(" ");
              builder.append(expandDefinition(definitions.get(ii)));
          }
  
          if (uniqueConstraintColumns != null) {
              for (List<String> uCols : uniqueConstraintColumns) {
                  builder.append(", UNIQUE (");
                  appendColumns(uCols, builder);
                  builder.append(")");
              }
          }
  
          if (primaryKeyColumns != null && !primaryKeyColumns.isEmpty()) {
              builder.append(", PRIMARY KEY (");
              appendColumns(primaryKeyColumns, builder);
              builder.append(")");
          }
  
          builder.append(")");
  
          executeQuery(conn, builder.toString());
          log("Database table '" + table + "' created.");
          return true;
      }
docs: from DatabaseLiaison