Запрос на самостоятельную ссылку таблицы SQL против уникальных ограничений с использованием контрольной суммы - PullRequest
0 голосов
/ 30 июля 2009

Я хотел бы лучше понять различия для проверки уникальности в записи перед вставкой между использованием CHECKSUM (с уникальными ограничениями) против оператора самоссылающейся таблицы , как показано ниже , По каким сценариям один из вариантов будет лучшим выбором по сравнению с другим и по каким причинам?

Требование: Каждый набор столбцов должен быть уникальным для каждой записи в таблице, поэтому я собрал это утверждение; проверить все столбцы в одном обращении к базе данных.

INSERT INTO tblTable
(Column1, Column2, Column3, Column4, Column5, Column6) 
SELECT 
@Column1, @Column2, @Column3, @Column4, @Column5, @Column6 
WHERE NOT EXISTS 
    (SELECT DISTINCT 
        t1.Column1, 
        t1.Column2,  
            t2.Column3, 
            t2.Column4, 
                t3.Column5, 
                t3.Column6 
    FROM tblTable t1 
        JOIN tblTable t2 ON (t1.UID = t2.UID)
        JOIN tblTable t3 ON (t1.UID = t3.UID)
    WHERE
        t1.Column1 = @Column1 and 
        t1.Column2 = @Column2 and 
            t2.Column3 = @Column3 and 
            t2.Column4 = @Column4 and 
                t3.Column5 = @Column5 and 
                t3.Column6 = @Column6)

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Зачем вам нужно больше, чем это предложение НЕ СУЩЕСТВУЕТ?

NOT EXISTS 
    (SELECT *
    FROM tblTable t1 
    WHERE
        t1.Column1 = @Column1 and 
        t1.Column2 = @Column2)

Серьезно.

Я никогда не думал об этом ... но само объединение подразумевает уникальные проверки более чем одной строки (или уникальные по группе строк? Или уникальные по родительским / дочерним строкам?). Что лишит законной силы уникальную концепцию строк ...

Редактировать, во втором чтении

Просто используйте стандартное уникальное ограничение .

Нет необходимости в CHECKSUM , что в любом случае не гарантирует уникальность.

Однако существует небольшая вероятность того, что контрольная сумма не изменится. За это причина, мы не рекомендуем использовать CHECKSUM для определения наличия значений изменилось, если ваше приложение не может терпеть иногда пропущенные изменения

1 голос
/ 30 июля 2009

Использование ограничения Unique гарантирует, что ограниченные данные будут уникальными независимо от того, как они вставляются (вручную из редактора запросов, с помощью хранимой процедуры, с помощью инструмента ORM или любого другого уровня абстракции). Разработчики не должны забывать проверять каждый написанный запрос, что они не нарушают принцип. Это также делает ваши запросы менее запутанными и легко читаемыми. Нет шансов на ошибку.

...