   `do-bulk-import-and-validate-csv`) and transforms (see
   `data-spec/translation-fns` in
   `do-bulk-import-and-validate-csv`). Inserts the row into the
-  database, and records any UNIQUE constraint-failing SQLExceptions as
-  errors. Returns the context `ctx`. If the supplied chunk is empty,
-  simply returns the context as-is."
+  database, retries any UNIQUE id constraint-failing SQLExceptions
+  removing ids, and marks others as errors. Returns the context
+  `ctx`. If the supplied chunk is empty, simply returns the context
+  as-is."
   [{:keys [columns filename] :as data-spec}
    {:keys [transforms column-names headers sql-table line-number] :as file-ctx}
    ctx chunk]

  (->> reader .readLine csv/read-csv first))

(defn warn-if-extraneous-headers
  [ctx {:keys [table] :as data-spec} headers column-names]
  (let [extraneous-headers (seq (set/difference (set headers) (set column-names)))]
    (if extraneous-headers

       (map str/lower-case)))

(defn required-header-names
  "Given a collection of column maps, returns cleaned (of non word
  characters), lower-cased string names (:name) of all the columns
  which are required (:required)."
  [columns]
  (-> (comp (filter :required)
            (map :name)
