- Column names come from the header row
- The first CSV row supplies the column list, and each subsequent row becomes one set of values. The header names must match your table's columns, rename them in the CSV first if they do not, since the generator has no schema to check against.
- How values are escaped
- Single quotes are doubled, which is the SQL standard escape: O'Brien becomes 'O''Brien'. That keeps the value inside one string literal no matter what it contains. Backslashes are not treated as escapes, since standard SQL does not use them, note that MySQL does by default unless NO_BACKSLASH_ESCAPES is set.
- Type inference and NULL
- Values that are unambiguously numbers are written unquoted, true and false become boolean literals, and an empty cell becomes NULL rather than an empty string. That last choice is worth knowing: if a blank should mean the empty string in your schema, turn type inference off so every value is quoted as text.
- Identifier quoting differs by dialect
- PostgreSQL and standard SQL use double quotes, MySQL and MariaDB use backticks, and SQL Server uses square brackets. Selecting the right dialect produces the correct form, which matters for any identifier that is a reserved word or contains unusual characters.
- One statement per row, or one for all
- Separate statements are easier to debug, since a failure names the row that caused it, and they work with any database. A single multi-row INSERT is considerably faster for bulk loads but has practical limits, Oracle does not support the syntax at all, and MySQL caps it by max_allowed_packet. Split very large batches.
- Where a real bulk loader is better
- For tens of thousands of rows, your database's native loader (PostgreSQL COPY, MySQL LOAD DATA INFILE, SQL Server bcp) will be dramatically faster than generated INSERTs. This tool is aimed at the hundreds-of-rows case.