Первичный ключ таблицы должен быть уникальным. Если ваш набор данных со временем растет, недостаточно проверить, уникальны ли теперь столбцы. Они должны быть уникальными навсегда. Так что в этом случае я бы избегал естественного ПК и выбрал суррогатный ключ.
Если вы на 100% уверены, что должен быть естественный ключ, но вы просто не знаете столбцы, с которых вы начинаете, определяя различную кардинальность столбцов:
SELECT COUNT(*),
COUNT(DISTINCT column1),
COUNT(DISTINCT column3),
...
FROM table
Если для любого столбца уникальное количество значений равно общему количеству строк, вы нашли ключ. Если это несколько столбцов, вам нужно использовать метод проб и ошибок. Вы знаете, что произведение отдельных значений столбцов ваших ключевых кандидатов должно быть больше или равно общему количеству строк.
COUNT(DISTINCT key_column1) * COUNT(DISTINCT key_column2) * COUNT(DISTINCT key_column3) >= COUNT(*)
Зная это, вы можете искать правдоподобные комбинации, например
SELECT COUNT(DISTINCT key_column1 || key_column2 || key_column3), COUNT(*)
FROM table
Если в таблице всего пара тысяч строк, производительность не должна быть проблемой.
Я думаю, вы можете сделать это полностью автоматическим, используя словарь данных, но у меня нет под рукой решения.
person
fhossfel
schedule
29.06.2017