The requirements. A primary key must uniquely identify each record, must never change (because other tables refer to it), and must never be empty (1).
FullName — unsuitable. Names are not unique: in a hospital of thousands, two patients called the same thing is a certainty, and the records could then not be told apart (1). Names also change — on marriage or by deed poll — and changing a primary key would break every other record that refers to it (1).
DateOfBirth — clearly unsuitable. It fails uniqueness very badly, since hundreds of patients share any given birth date (1).
EmailAddress — closer, but still unsuitable. It is usually unique, but it changes when a patient switches provider, it may be empty because not every patient has one, and families sometimes share a single address — so uniqueness cannot be guaranteed either (1).
PatientNumber — the correct choice. Because it is generated by the system, it can be guaranteed unique, is never reused, is never empty, and there is no reason it would ever need to change, since it carries no real-world meaning that could become out of date (1).
Why stability matters most here. Other tables — appointments, prescriptions, test results — will hold PatientNumber as a foreign key. If the key could change, every one of those references would have to be found and updated together, and any that were missed would point to a patient that no longer exists (1).
Conclusion: use PatientNumber. The real-world fields remain useful for searching — staff will look patients up by name and date of birth — but searching does not require a field to be the primary key (1).
(8)