Postgres constraint for unique datetime range

You can keep your separate timestamp columns and still use an exclusion constraint on an expression: CREATE TABLE tbl ( tbl_id serial PRIMARY KEY , starts_at timestamp , ends_at timestamp , EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&) — no overlap ); Constructing a tsrange value without explicit bounds as tsrange(starts_at, ends_at) assumes default bounds: … Read more

Continuing a transaction after primary key violation error

You can also use SAVEPOINTs in a transaction. Pythonish pseudocode is illustrate from the application side: database.execute(“BEGIN”) foreach data_row in input_data_dictionary: database.execute(“SAVEPOINT bulk_savepoint”) try: database.execute(“INSERT”, table, data_row) except: database.execute(“ROLLBACK TO SAVEPOINT bulk_savepoint”) log_error(data_row) error_count = error_count + 1 else: database.execute(“RELEASE SAVEPOINT bulk_savepoint”) if error_count > error_threshold: database.execute(“ROLLBACK”) else: database.execute(“COMMIT”) Edit: Here’s an actual example of … Read more