public SqlUnit getUpdateSqlUnit(CrudModel cp) {
    List paramNames = new ArrayList();
    List<CrudField> primKeys = new ArrayList();
    StringBuffer sb = new StringBuffer();
    sb.append("UPDATE " + escapeField(cp.getTableName()) + " SET ");
    boolean firstPass = true;
    for (CrudModel.CrudField cf : cp.getFields()) {
      if (cf.isLinked()) continue;
      if (cf.isPrimary()) {
        primKeys.add(cf);
        continue;
      }
      if (firstPass) firstPass = false;
      else {
        sb.append(",");
      }
      sb.append(escapeField(cf.getFieldName()) + "=?");
      paramNames.add(cf.getName());
    }
    if (primKeys.size() == 0)
      throw new RuntimeException("There must be at least one primary key for CRUD getReadSqlCache");

    sb.append(" WHERE ");
    int i = 0;
    for (CrudModel.CrudField p : primKeys) {
      if (i > 0) sb.append(" AND ");
      sb.append(escapeField(p.getFieldName()) + "=?");
      paramNames.add(p.getName());
      i++;
    }
    String stmt = sb.toString();
    return new SqlUnit(stmt, paramNames);
  }