diff --git a/formatscaper/models.py b/formatscaper/models.py
index 631c3ec74dc3351a0b2da76b1735286017535075..bcb9a69f67f5939da48298feb1429350d11b0ba4 100644
--- a/formatscaper/models.py
+++ b/formatscaper/models.py
@@ -1,7 +1,7 @@
 import dataclasses
 from typing import List, Optional
 
-from sqlalchemy import ForeignKey, create_engine
+from sqlalchemy import ForeignKey, UniqueConstraint, create_engine
 from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column, relationship
 
 
@@ -98,6 +98,9 @@ class Result(ModelBase):
     format_id: Mapped[Optional[int]] = mapped_column(ForeignKey("format.id"))
     format: Mapped[Format] = relationship(back_populates="results")
 
+    # filenames are unique per record
+    __table_args__ = (UniqueConstraint("record", "filename"),)
+
     @property
     def risk(self):
         """Calculate the risk assessment for the file."""