How do I make a citation table where work can't refer to itself?
you can use check constraint, add this to table definition:

CONSTRAINT check_work_ids_are_not_equal CHECK work_1 &lt;&gt; work_2


yes, you can create PK on (work_1, work_2)
it has a sense to add index on Work_citation(work_2). This way you will not need to scan the whole Work_Citation table when delete rows from Work table to check that the are no referencing rows