2010-12-02 2 views
1

У меня есть таблица базы данных со многими столбцами и нет указанного первичного ключа. Также нет списка супер ключей. Помимо итеративной попытки всех потенциальных клавиш/столбцов, есть ли способ для меня, используя SQL, попытаться определить, может ли подмножество ключей создавать уникальный идентификатор для моей таблицы?пытаясь определить уникальный идентификатор таблицы базы данных

Например, таблица может иметь 4 столбцов первой имя, фамилию, адрес и почтовый и данных я вижу:

John, Smith, 1 main st, 00001 
Mary, Smith, 1 main st, 00001 
Mary, Smith, 2 sub st, 00002 

В этом случае я должен буду первый, последний и почтовый индекс, как мой уникальный ключ.

John, Smith, 1 main st, 00001 
John, Smith, 1 main st, 00001 

В этом случае нет уникального ключа.

Пожалуйста, не комментируйте мою конструкцию таблицы и/или нормализацию баз данных, я просто пытаюсь найти практический ответ. Благодарю.

Это мой вопрос: помимо итеративной попытки всех ключей/столбцов кандидата, есть ли способ для меня, используя SQL, попробовать и понять, может ли подмножество ключей создавать уникальный идентификатор для моей таблицы?

ответ

3

Вы не можете найти, если комбинация «может» сделать первичный ключ. Вы можете найти, если один из них сделает хороший первичный ключ для существующего набора данных.

Чтобы найти, если набор полей кандидат или нет, вы можете рассчитывать отчетливый этих полей (с помощью группы по с накопительным пакетом), и сравнить с count (*)

5

Поиск подмножества уникальных значений в этом случае кажется настолько специфичным для конкретного набора данных. Что, если вы сегодня придете к подмножеству и обнаружите, что завтра вы не можете вставить новую строку?

Используйте искусственный ключ, как целое число с автоматическим приращением.

+0

Спасибо. Я на самом деле пытаюсь сравнить две базы данных, но не могу найти ключ для их сравнения. – 2010-12-02 21:28:57

+0

Хотя я верю в искусственные ключи, если у вас есть естественный ключ, который должен быть привязан к базе данных с уникальным ограничением. Просто создание искусственного ключа, чтобы избежать анализа данных, является плохой практикой. – HLGEM 2010-12-02 22:11:12

4

Вкратце: нет, в T-SQL нет никакого способа сделать это.

Мой совет: просто добавьте стол ID INT IDENTITY PRIMARY KEY к таблице. Он гарантированно будет уникальным, он будет заполнен автоматически, когда вы его создадите, это быстро и просто, не беспорядочно », это действительно уникально или есть какие-либо комбинации строк, которые нарушают уникальность» вопросы ......

Просто сделайте это - это самый простой способ!

+1

+ 1 для использования слова: «automagically» .... новый мой любимый :-) – SheldonH 2012-01-20 17:36:22

0

есть обновление аномалий в этой схеме: не может человек, не зная его адрес

лучше подход заключается в разделении на три таблицы, одна для лиц и один для PersonAddress

> perons: id,firstname, lastname 
> address: id,address: 
> personaddress: personid, addressid 
+0

OP, похоже, не открыт для изменения структур данных – 2010-12-02 21:25:06

2

если вы сравниваете две базы данных, то вам может видеть, существуют ли в источнике db одинаковые строки с такими структурами:

select a,b,c,d 
from mytable 
having count(*) > 1 
group by a,b,c,d 

Включает в себя все столбцы.

затем использовать все столбцы, как «ключ строки», чтобы увидеть, если он существует в целевой системе

0

Вы не можете найти, если комбинация «может» сделать первичный ключ.

Я на самом деле не согласен с этим, я думаю, что можно написать запрос, который будет выбирать все возможные перестановки столбцов из таблицы и объединить каждую перестановку в одно уникальное значение (самый простой, грубый способ заключается в CAST все они в VARCHAR и связывают их с разделительным символом - лучшим способом будет какая-то хеш-функция).

С помощью одного прохода вы имели бы такой набор столбцов, как P1, P12, P123, P2, P23, P3 и т. Д. (В случае трех столбцов). Затем вы можете сделать запрос с COUNT (*) против COUNT (DISTINCT) для каждого столбца перестановки, и вы увидите, какие перестановки уникальны.

Использование динамического SQL, возможно, вы сделаете так, чтобы оно работало в любой таблице, хотя я не знаю о пределе столбца для SQL Server.

1

Существует гораздо быстрее метод.

Предприятие dbms имело его в течение многих лет, но MS SQL Server 2005 (можно использовать в 2008 году), а затем предоставляло функцию HashBytes(). Преобразуйте столбцы в CHAR() (VARCHAR на MS), соедините их; затем хэш их; затем сравните хеши. Вы можете сравнить две таблицы в одной команде SELECT. IIRC max 8000 символов в строке.

(Если вы используете этот ответ, отмените и повторите свой выбор ответа.)

Смежные вопросы