My personal preference is {table_name}_key for primary keys.
Reason 1
Should you use a NATURAL JOIN the common column will only appear once in the set of returned columns.
Reason 2
It removes ambiguity.
"
foo.id" can easily be mis-typed as "
bar.id" and a query might still run, with possible nasty side effects. That can catch you out if it has been a long day!
If you type "bar.foo_id" instead of "foo.foo_id" the query will fail as table and column do not match.
Reason 3 (a)
It's unlikely that the primary key on a table might change, but I don't like to tie function (data type, index status) to the name of a column. e.g. I would never use "unique_email_address" or "text_total".
Reason 3 (b)
A primary key might consist of one column initially, but then might expand to become a composite key, at that point you have to start renaming columns.