Filling out a form
INSERT adds rows. PostgreSQL validates every value against the schema (types, constraints, foreign keys) before the row lands — bad inserts are rejected at the door, not silently corrupting your data later.
Always list the columns
INSERT INTO users VALUES (...) without column names depends on column order in the table definition. Add a column tomorrow and every such INSERT breaks. Always list the columns you're inserting; future-you will thank you.
Multi-row inserts and UPSERTs
One INSERT with many rows is dramatically faster than many INSERTs in a loop — fewer round trips, less per-row overhead. ON CONFLICT handles "insert this row, but if it conflicts on a unique key, update instead" atomically.