Alternatives to MySQL Partitioning, so we can have a Unique Index
Since you won't have even a million rows in the table, don't bother to PARTITION it.  Then you won't have any trouble with the UNIQUEness constraint.
Change the indexing:


Plan A:

PRIMARY KEY(Id),   -- notice: `Created` was removed
INDEX(Created),    -- for purging
UNIQUE(`CustId`,`SourceName`,`SourceId`)  -- as desired


Plan B (this assumes you have no real use for id):

PRIMARY KEY(`CustId`,`SourceName`,`SourceId`)  -- Unique
INDEX(Created)    -- for purging



Purge daily, not monthly.  This is because DELETE is much slower than DROP PARTITION.  If you still run into performance troubles:  Using Plan B, write a loop to delete the rows for each CustId one at a time.


(I prefer Plan B for your situation.)

(My comments apply to all versions.)

Usually, each partition has 4M-7M of "free" space.  Hence a partitioned table is inherently bigger than the non-partitioned equivalent.