Разное

Уникальные значения sql: Как выбрать только уникальные (неповторяющиеся) записи « Веб-заметки и Веб-подсказки

Содержание

SQL-Урок 4. Фильтрация данных (WHERE)

В большинстве случаев необходимо получать не все записи, а только те, которые соответствуют определенным критериям. Поэтому для осуществления фильтрации выборки в SQL есть специальный оператор WHERE.

1. Простое фильтрование оператором WHERE.

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

Пример запроса для отбора текстовых значений:

SELECT * FROM Sumproduct WHERE Product = ‘Bikes’

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

Пример запроса для отбора числовых значений:

SELECT * FROM Sumproduct WHERE Amount > 40000 ORDER BY Amount

В этом примере мы отобрали записи, в которых выручка от реализации составила более 40 тыс. $ и, дополнительно, все записи посортировали по возрастанию по полю Amount.

В таблице ниже указан перечень условных операторов, поддерживаемых SQL:

Знак операцииЗначение
=Равно
<>Не равно
<Меньше
<=Меньше или равно
>Больше
>=Больше или равно
BETWEENМежду двумя значениями
IS NULLОтсутствует запись

2. Фильтрация по диапазону значений (BETWEEN).

Для отбора данных, которые лежат в определенном диапазоне, используется оператор BETWEEN. В следующем запросе будут отобраны все значения, лежащие в пределах от 1000 $ в 2000 $ включительно, в поле Amount.

SELECT * FROM Sumproduct WHERE Amount BETWEEN 1000 AND 2000

Очередность сортировки будет зависеть от порядка расположения полей в запросе. То есть, в нашем случае сначала данные будут посортированы по колонке Amount, а затем по City.

3. Выборка пустых записей (IS NULL).

В SQL существует специальный оператор для выборки пустых записей (NULL). Пустой записью считается любая ячейка в таблице, в которую не введены какие-либо символы. Если в ячейку введен или пробел, то считается, что поле заполнено.

SELECT * FROM Sumproduct WHERE AmountIS NULL

В примере выше, мы нарочно удалили два значения в поле Amount, чтобы продемонстрировать работу оператора NULL.

4. Расширенное фильтрации (AND, OR).

Язык SQL не ограничивается фильтрацией по одному условию, для собственных целей вы можете использовать достаточно сложные конструкции для выборки данных одновременно по многим критериям. Для этого в SQL есть дополнительные операторы, которые расширяют возможности оператора WHERE. Такими операторами являются: AND, OR, IN, NOT. Приведем несколько примеров работы данных операторов.

SELECT * FROM Sumproduct WHERE Amount > 40000 AND City = ‘Toronto’

SELECT * FROM Sumproduct WHERE Month= ‘April’ OR Month= ‘March’

Давайте объединим операторы AND и OR. Для этого сделаем выборку велосипедов (Bikes) и коньков (Skates), которые были проданы в марте (March).

SELECT * FROM Sumproduct WHERE Product = ‘Bikes’ OR Product = ‘Skates’ AND Month= ‘March’

Видим, что в нашу выборку попало за много значений (кроме марта (March), также январь (January), февраль (February) и апрель (April)). В чем же причина? А в том, что SQL имеет приоритеты выполнения команд. То есть оператор AND имеет более высокий приоритет, чем оператор OR, поэтому сначала были отобраны записи с коньками, которие проданные в марте, а потом все записи, касающиеся велосипедов.

Итак, чтобы получить правильную выборку, нам нужно изменить приоритеты выполнения команд. Для этого используем скобки, как в математике. Тогда, сначала будут обработаны операторы в скобках, а затем — все остальные.

SELECT * FROM Sumproduct WHERE (Product = ‘Bikes’ OR Product = ‘Skates’) AND Month= ‘March’

5. Расширенная фильтрация (оператор IN).

SELECT * FROM Sumproduct WHERE ID IN (4, 12, 58, 67)

Оператор IN выполняет ту же функцию, что и OR, однако имеет ряд преимуществ:

  • При работе с длинными списками, предложение с IN легче читать;
  • Используется меньшее количество операторов, что ускоряет обработку запроса;
  • Самое важное преимущество IN в том, что в его конструкции можно использовать дополнительную конструкцию SELECT, что

6. Расширенная фильтрация (оператор NOT).

SELECT * FROM Sumproduct WHERE NOT City IN (‘Toronto’, ‘Montreal’)

Ключевое слово NOT позволяет убрать ненужные значения из выборки. Также его особенностью является то, что оно проставляется перед названием столбца, участвующего в фильтровании, а не после.

Предыдущие уроки по SQL:

SQL-Урок 1. Язык SQL. Основные понятия.

SQL-Урок 2. Выборка данных (SELECT)

SQL-Урок 3. Сортировка (ORDER BY)

Свойство UniqueValues (Уникальные значения) — Access

Свойство UniqueValues (Уникальные значения) используется для исключения записей, содержащих повторяющиеся данные в полях, отображаемых в режиме таблицы. Например, если результаты запроса содержат несколько полей, запись будет включена в результаты только в том случае, если сочетание значений всех таких полей уникально.


Примечание: Свойство UniqueValues применяется только к запросам на добавление, создание таблицы и выборку.

Значения

Свойство UniqueValues может принимать следующие значения:




Значение


Описание

Yes (Да)

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

No (Нет)

(По умолчанию.) Отображаются все записи.

Значение свойства UniqueValuess можно задать в окне свойств запроса или в окне запросов в режиме SQL.


Примечание: Это свойство можно задать при создании запроса с помощью инструкции SQL. Предикат DISTINCT соответствует значению свойства UniqueValues. Предикат DISTINCTROW соответствует значению свойства UniqueRecords.

Замечания

Если для свойства UniqueValues (Уникальные значения) установлено значение Yes (Да), результаты запроса не будут обновляться и отражать последующие изменения, сделанные пользователями.

Свойства UniqueValues и UniqueRecords связаны таким образом, что только для одного из них одновременно может быть задано значение Yes. Например, если для свойства UniqueValues задается значение Yes, то свойство UniqueRecords автоматически получает значение No. Однако значение No можно указать для обоих этих свойств. Если для обоих свойств задано значение No, возвращаются все записи.


Совет

Если необходимо подсчитать количество экземпляров значения в поле, создайте итоговый запрос.


Пример

Инструкция SELECT в этом примере возвращает список стран и регионов, в которых проживают клиенты. Так как в стране или регионе может быть множество клиентов, соответствующее значение у многих записей в таблице Customers может совпадать. Однако каждая страна или регион в результатах запроса отображается только один раз.

В этом примере используется таблица Customers, включающая следующие данные:









Страна или регион


Название компании

Бразилия

Familia Arquibaldo

Бразилия

Gourmet Lanchonetes

Бразилия

Hanari Carnes

Франция

Du monde entier

Франция

Folies gourmandes

Германия

Frankenversand

Ирландия

Hungry Owl All-Night Grocers

Эта инструкция SQL возвращает страны и регионы, перечисленные в таблице:


SELECT DISTINCT Customers.CountryRegion
FROM Customers;







Возвращаемые страны и регионы

Бразилия

Франция

Германия

Ирландия

Выбрать только уникальные записи из двух таблиц в SQL

Как в SQL выбрать, получить, вытащить только уникальные записи из двух таблиц, не пересекающиеся? Получить только те строки которые есть в одной таблице, но нет в другой. На примере MariaDB и MySQL разбираемся. Допустим есть список покупок (продукты которые надо купить) и список продуктов которые я уже купил. Мне надо вытащить только продукты, которые я еще не купил. То есть надо к списку продуктов найти все совпадения в списке купленных продуктов, а вытащить только те продукты которым не будет соответствия.

Варианты: вложенный запросы (подзапрос), объединения (join), операторы фильтрации, функции SQL?

Фильтрация с помощью операторов NOT и AND в условии WHERE

Продукты которые нужно купить и которые уже куплены лежат в одной таблице. WHERE NOT убирает из таблицы все продукты которые уже куплены. AND ищет все продукты которые осталось купить. Здесь фильтруем по статусу.

SELECT //Вытаскиваем
SpisokPokupok.id_produkta, //Идентификатор продукта
SpisokPokupok.nazvanie_produkta, //Название продукта
SpisokPokupok.status_produkta //Статус продукта (купил или не купил)
FROM //Откуда?
SpisokPokupok //Из Списка покупок
WHERE NOT //Где "НЕТ"
SpisokPokupok.status_produkta = 'kupil' //Где статус продукта не равен 'купленный'
AND SpisokPokupok.status_produkta = 'nado_kupit' //И получить продукты, где статус еще 'не купил'

Ошибок этот метод не выдает, но результат не правильный!!!

Использование вложенного запроса (подзапроса) и операторов NOT и AND в условии WHERE

Здесь фильтрую еще по идентификатору продукта.

SELECT 

SpisokPokupok.id_produkta,
SpisokPokupok.nazvanie_produkta,
SpisokPokupok.status_produkta

FROM
SpisokPokupok

WHERE
SpisokPokupok.id_produkta NOT IN (

SELECT SpisokPokupok.id_produkta FROM SpisokPokupok WHERE SpisokPokupok.status_produkta = ‘kupil’)

AND SpisokPokupok.status_produkta = ‘nado_kupit’

;

Информация о материале
Родительская категория: Продукты
Категория: Sql

Как выбрать неповторяющиеся значения из базы данных.

Вы здесь:
Главная — MySQL — SQL — Как выбрать неповторяющиеся значения из базы данных.


Всем привет! В этой статье я хочу рассказать вам о том, как выбрать неповторяющиеся значения из базы данных на SQL.

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

Вы можете использовать ключевое слово DISTINCT, чтобы получить только неповторяющиеся записи из таблицы.

Синтаксис


SELECT DISTINCT name, name2, name3... FROM name_of_table;

Пример

К примеру, у вас есть таблица с такими полями: id, name, contact, adress, city, code, country.

Это таблица с клиентами. Клиенты могут быть с одинаковых городов, вы же хотите получить только неповторяющиеся города.


SELECT DISTINCT city FROM customers;

Все, вы получили только тех клиентов, у которых разные города.

Итак, на этом все. Спасибо за внимание и удачных запросов!


  • Создано 20.07.2014 20:22:31



  • Михаил Русаков

Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):


  1. Кнопка:

    <a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так:


  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    [URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]

Как подсчитать уникальные пары значений в SQL?

С помощью следующей инструкции sql я могу получить все уникальные значения с их подсчетами для данного столбца:

select column, count(column) as count 
         from table group by column order by count desc;

Как бы я получил все уникальные пары значений с подсчетами. Например, если бы у меня была таблица с столбцами first_name и last_name, я мог бы найти результаты примерно так:

first_name | last_name / count

Джон | Смит | 42

Джон | Джонсон | 39

Дэвид | Смит | 37

etc…

могу ли я сделать это в basic SQL? Обычно я использую MySQL, но я предполагаю, что любое решение, которое вы придумаете, должно быть переведено на любую БД.

15

автор: Jay Askren

4 ответов


вы почти правильно поняли… Вы просто добавляете дополнительный


Если вы просто хотите посчитать, сколько различных пар, вы можете сделать это более просто.
А GROUP BY предложение не требуется.

SELECT COUNT(DISTINCT first_name, last_name) AS count_names FROM Table

используйте несколько столбцов в предложении group by.

select first_name, last_name, count(*) as count from table group by first_name, last_name

SELECT first_name, last_name, COUNT(distinct last_name) AS c
FROM ttable
GROUP BY first_name, last_name
HAVING c > 999
ORDER BY c DESC 

добавление distinct сделает это в MYSQL.
Спасибо


Запрос Sql с уникальным значением столбца

Вопрос:

Моя цель — получить написанный запрос. У меня есть три таблицы: A, B и C. Таблицы написаны так, что A.bID = B.bID и B.cID = C.cID. Это в основном позволяет мне написать запрос, в котором я привязываю запись от a до b, и связывать запись b с записью с c. До сих пор такой хороший, простой запрос.

В чем моя проблема: один из столбцов, включенных в запрос (пусть называется C.col3) должен иметь уникальные значения; значения в этом столбце могут отображаться только один раз в результате запроса, но другие столбцы из других таблиц не имеют этого требования.

Может кто-нибудь помочь мне написать этот запрос?

Спасибо…

Обновление 1:

Вот расположение таблицы (извините, я должен использовать общие имена)

Таблица A
aID, bID, aCol1, aCol2, aCol3… aCol10

Таблица B
bID, cID, bCol1, bCol2, bCol3… bCol10

Таблица C
cID, cCol1, cCol2, col3, cCol4… cCol10

Без единственного ограничения значения в col3 я бы написал запрос следующим образом:

SELECT
A.aID, A.bID, A.aCol1 ... A.aCol10,
B.bID, B.cID, B.bCol1 ... B.bCol10,
C.cID, C.cCol1, C.cCol2, C.col3 ... C.cCol10
FROM
A, B, C
WHERE
A.bID = B.bID AND B.cID = C.cID

… но, конечно, это не гарантирует, что значения в C.col3 уникальны.

Обновление 2:
Подробнее…
Таблица A и таблица B имеют отношение от одного до многих; A — это «заголовок», B — «элемент».
Таблица B и таблица C имеют отношение «один к одному».
Эти таблицы являются частью механизма кэширования, поэтому множество данных, которые выглядят одинаково, но все еще различаются в некоторых столбцах.
Поскольку A является заголовком, большинство дубликатов значений будет найдено в A.

Сначала мне нужно упорядочить строки по A.aID, но после этого мне нужны только первые возвращенные строки, где значение для C.col3 не отображается в предыдущей строке для этого col.

Это делает вещи немного яснее, или я все еще не имею никакого смысла?:)

Окончательное обновление:

Я выбрал Бартоша Климека, поскольку он был самым близким к тому, что мне нужно; Мне просто нужно было изменить предложение вложенного соединения в середине.

Спасибо всем за вашу помощь!

Лучший ответ:

SELECT A.*, B.*, C.*
  FROM C
    JOIN B ON B.cID = C.cID
    JOIN A ON A.bID = B.bID
    JOIN
    (
      SELECT id = min(aID)
        FROM C
          JOIN B ON B.cID = C.cID
          JOIN A ON A.bID = B.bID
        GROUP BY col3
    ) D ON D.id = A.aID

Обратите внимание, что подзапрос в конце гарантирует, что для каждого значения col3 у вас будет не более одной записи в конечном наборе результатов. Выбранная запись — та, которая имеет минимальный идентификатор. Очевидно, я предполагаю, что aID, bID и cID являются первичными ключами A, B и C соответственно.

Ответ №1

Я собираюсь сделать небольшой пример того, что вы пытаетесь сделать, и, надеюсь, это поможет выяснить, почему то, что вы просите (в настоящее время), невозможно.

Если у вас есть таблица клиентов [CustomerID, CustomerName] и таблица заказов [OrderID, CustomerID, DollarAmount]

Если вам нужны все заказы для клиентов:

SELECT CustomerName, OrderID, DollarAmount
FROM Customer, Orders
WHERE Customer.CustomerID = Orders.CustomerID

он вернет

 "Acme Corp.", 1, $2300
"Acme Corp.", 2, $3022
"A company",  3, $1234

Все хорошо.

Но эквивалент вашего вопроса задает этот запрос, но с уникальными именами CustomerNames. Что бы вы отображали для OrderID и DollarAmount у «Acme Corp»?

Вы можете использовать агрегаты для отображения чего-либо,

SELECT CustomerName, MAX(OrderID), SUM(DollarAmount)
FROM Customer, Orders
WHERE Customer.CustomerID = Orders.CustomerID
GROUP BY Orders.CustomerID

Но я считаю, что вы упомянули, что не хотите использовать агрегаты.

Это ясно объясняет проблему?

Ответ №2

Я начал публиковать еще один ответ, но после переосмысления его я удалил его. Если я правильно читаю вопрос, я думаю, что это вопрос невозможный/нелогичный. Позвольте мне объяснить пример. если я прочитаю это неправильно, прошу прояснить вопрос с примерами того, что вы ищете.

Таблица A


BID COL1
1   Value1
2   Value1
3   Value2

Таблица B


BID CID COL 2
1   4   ValueX
2   5   ValueY
3   6   ValueZ

Таблица C


CID COL3
4   Value#
5   Value@
6   Value~

Ожидаемый результат


A.Col1   A.BID B.BID B.CID B.COL2 C.CID C.COL3
Value1?? 1     1     4     ValueX 4     Value#
Value1?? 2     1     5     ValueY 5     Value@
Value2   3     3     6     ValyeZ 6     Value~


В вопросе, который вы не хотите, чтобы значение1 повторялось в первом столбце, но что вы предлагаете, входит во вторую строку, где она обычно повторяется, если у вас не было уникального ограничения?

Ответ №3

select distinct c.col3 from c inner join b on c.cID = b.cID inner join a on b.bID = a.bID

Ответ №4

Если вам нужны другие значения из таблиц, используйте:

select max(a.col1), sum(b.col2), col3 from a, b, c
where A.bID = B.bID, and B.cID = C.cID
group by C.col3

Во всех столбцах, не сгруппированных вами, вам необходимо использовать агрегатные функции, такие как

  • AVG: среднее значение столбца.
  • COUNT: количество записей.
  • MAX: Максимум столбца.
  • MIN: Минимум столбца.
  • SUM: сумма столбца.

Уникальный ключ и нулевые значения

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

Однако есть один недостающий бит — мы должны создать связь между полями « Sales », « Customers » и « Items » и таблицей « Companies ».

Таблица «Компании»

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

Первичный ключ SQL

Что ж, надеюсь, вы уже видите, что « company_id » — это первичный ключ в нем. Обнаружение этого не должно стать для вас чем-то новым. С другой стороны, у вас редко бывает две или более компаний с одним и тем же названием, но это возможно, особенно если они зарегистрированы в другом штате или работают в разных отраслях.

Как насчет поля «номер_фона_фона»? У вас не может быть двух полностью идентичных номеров в США, не так ли? Когда вы набираете номер телефона, где-нибудь в США зазвонит только один телефон. Следовательно, можно сделать вывод, что значения в этом поле должны быть уникальными.

Уникальный ключ SQL

Однако это должно означать, что «номер_фона_фона» также является первичным ключом ! Возможно ли это? Мы знаем, что в таблице есть один и только один первичный ключ , и здесь столбец «company_id» — это первичный ключ !

Не беспокойтесь, у этого типа поля есть имя, и это уникальный ключ .Он используется всякий раз, когда вы хотите указать, что вы не хотите видеть повторяющиеся данные в заданном поле, как в нашем примере с номером телефона штаб-квартиры.

В чем разница между первичным и уникальным ключами?

Нулевые значения

Существует одно существенное различие между уникальными ключами и первичными ключами , которое состоит в том, что они могут содержать нулевых значений .

Это означает, что если мы не знаем телефонный номер штаб-квартиры « Company D », мы все еще можем иметь эту запись, и наша таблица будет функционировать как часть реляционной базы данных.Однако он не даст нам номер телефона « Company D ».

Если вместо этого мы удалим номер два как « company_id » и оставим имя « Company B » и соответствующий номер телефона, SQL отобразит сообщение об ошибке. Это потому, что « company_id » является первичным ключом , и мы обязаны предоставлять данные в каждой строке этого столбца.

Количество клавиш

Кроме того, таблица может иметь 0, 1, 2 или более уникальных ключей .Это означает, что в зависимости от требований базы данных таблица может содержать или не содержать один или несколько столбцов уникального ключа и . Это на отличается по отношению к характеристикам первичного ключа . Ограничение :

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

Каковы сходства между первичным и уникальным ключами?

Кроме того, что похоже на между двумя типами ограничений, так это то, что оба могут применяться к нескольким столбцам, а не только к одному столбцу.

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

Использование уникальных ключей

Итак, работа с уникальными ключами имеет много общего с работой с первичными ключами. Иногда они могут понадобиться нам даже для той же задачи. Основное различие между ними возникает, когда речь идет о нулевых значениях .Хотя мы можем иметь пустые ячейки в уникальном ключе, мы не можем допустить этого в первичном ключе. У нас также может быть более одного уникального ключа в таблице.

В следующем руководстве мы рассмотрим, как таблицы связаны друг с другом. Проверить это.

***

Хотите отточить свои навыки работы с SQL? Узнайте, как применить теорию на практике, с помощью наших практических руководств !

Следующее руководство: Взаимосвязи между таблицами

SQL SELECT DISTINCT, COUNT, ROWS — с примерами

Как мне вернуть уникальные значения в SQL?

SELECT DISTINCT возвращает только отличные (т.е.е. разные) значения.
Ключевое слово DISTINCT исключает повторяющиеся записи из результатов.

DISTINCT можно использовать с агрегатами: COUNT, AVG, MAX и т. Д.
Он работает с одной колонкой. DISTINCT для нескольких столбцов не поддерживается.

Синтаксис SQL SELECT DISTINCT

Общий синтаксис

ВЫБЕРИТЕ DISTINCT имя-столбца
  ОТ имя-таблицы
 

Может использоваться с COUNT и другими агрегатами

ВЫБРАТЬ СЧЕТЧИК (РАЗЛИЧНОЕ имя-столбца)
  ОТ имя-таблицы
 

ПОСТАВЩИК
Идентификатор
Название компании
Контактное имя
Город
Страна
Телефон

Примеры SQL SELECT

Проблема : Перечислите все уникальные страны-поставщики в алфавитном порядке.

ВЫБЕРИТЕ ОТЛИЧНУЮ страну
  ОТ поставщика
ЗАКАЗ ПО СТРАНЕ
 

Результат: 16 рядов

Страна
Австралия
Бразилия
Канада
Дания

ПОСТАВЩИК
Идентификатор
Название компании
Контактное имя
Город
Страна
Телефон

Задача : Перечислите количество уникальных стран-поставщиков

ВЫБРАТЬ СЧЕТЧИК (ОТЛИЧНАЯ страна)
  ОТ поставщика
 

Результат:

Учебное пособие по ограничению

SQL UNIQUE

Резюме : в этом руководстве вы узнаете об уникальном ограничении SQL и о том, как гарантировать отсутствие повторяющихся значений в определенном столбце.

Введение в ограничение SQL UNIQUE

Ограничение UNIQUE гарантирует отсутствие повторяющихся значений в определенном столбце, который не является первичным ключом. Таблица может иметь только одно ограничение PRIMARY KEY, но может иметь несколько ограничений UNIQUE. В отличие от ограничения PRIMARY KEY, вы можете ввести значение NULL для столбца, который имеет ограничение UNIQUE. Однако допускается только одно значение NULL.

Вы используете ограничение UNIQUE для столбца или комбинации столбцов, которые не являются первичным ключом таблицы.

Создание ограничения SQL UNIQUE

Ограничения UNIQUE можно создать с помощью оператора CREATE TABLE или ALTER TABLE. Вы можете создать ограничение UNIQUE для одного или нескольких столбцов таблицы.

Давайте рассмотрим несколько примеров создания ограничений UNIQUE.

Ограничение SQL UNIQUE для 1 столбца, пример

Рассмотрим следующую таблицу пользователей :

Она имеет столбец идентификатора пользователя в качестве первичного ключа, который однозначно определяет каждую строку в таблице.Однако имя пользователя должно быть уникальным, чтобы система могла различать двух пользователей, когда они вошли в систему. Чтобы обеспечить уникальность имени пользователя, вы можете создать ограничение UNIQUE следующим образом:

CREATE TABLE users (

userid int (11) NOT NULL AUTO_INCREMENT,

username varchar (25) DEFAULT NULL,

password varchar (25) DEFAULT NULL,

firstname varchar (45) NOT NULL,

lastname varchar (45) NOT NULL,

дата создания DEFAULT NULL,

email varchar (255) DEFAULT NULL,

PRIMARY KEY (идентификатор пользователя),

UNIQUE (имя пользователя)

)

Если вы попытаетесь ввести новую строку, это вызовет дублирование значения в столбце имя пользователя , система базы данных выдаст сообщение об ошибке.

Ограничение SQL UNIQUE для 2 столбцов, пример

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

Вы можете добавить ограничение UNIQUE, чтобы обеспечить это. Чтобы сделать его более удобным, SQL позволяет вам определять ограничение UNIQUE для нескольких столбцов следующим образом:

CREATE TABLE users (

userid int (11) NOT NULL AUTO_INCREMENT,

username varchar (25) DEFAULT NULL,

пароль varchar (25) DEFAULT NULL,

firstname varchar (45) NOT NULL,

lastname varchar (45) NOT NULL,

дата создания DEFAULT NULL,

email varchar (255) DEFAULT NULL,

PRIMARY KEY (идентификатор пользователя),

CONSTRAINT user_info UNIQUE (имя пользователя, электронная почта)

)

Это обеспечивает уникальность пары имени пользователя и электронной почты в таблице пользователей .

Обратите внимание, что мы назвали ограничения UNIQUE с помощью ключевого слова CONSTRAINT. Мы можем использовать это имя, чтобы удалить ограничение UNIQUE позже, если захотим.

Чтобы определить UNIQUE для нескольких столбцов, мы помещаем список столбцов, разделенных запятыми, в скобки, следующие за ключевым словом UNIQUE.

Добавить ограничение SQL UNIQUE с помощью оператора SQL ALTER TABLE

Вы можете добавить ограничение UNIQUE к существующей таблице с помощью оператора ALTER TABLE. Например, следующий запрос добавляет ограничение UNIQUE для двух столбцов: имя пользователя и электронное письмо .

Пользователи ALTER TABLE

ДОБАВИТЬ ОГРАНИЧЕНИЕ user_info UNIQUE (имя пользователя, электронная почта)

Удаление ограничения SQL UNIQUE

Чтобы удалить существующее ограничение UNIQUE, вы также используете оператор ALTER TABLE

, как показано ниже.

ALTER TABLE имя_таблицы

DROP CONSTRAINT имя_ограничения

Например, чтобы удалить ограничение user_info UNIQUE, которое мы создали в приведенном выше примере, мы используем следующую команду: 011

11

ALTER TABLE пользователи

DROP CONSTRAINT user_info

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

  • Было ли это руководство полезным?
  • Да Нет

SQL NOT NULL, UNIQUE и SQL PRIMARY KEY

В этой статье на примерах объясняются ограничения SQL NOT NULL, Unique и SQL Primary Key в SQL Server.

Ограничения в SQL Server — это предопределенные правила и ограничения, которые применяются в одном или нескольких столбцах в отношении значений, разрешенных в столбцах, для поддержания целостности, точности и надежности данных этого столбца.Другими словами, если вставленные данные соответствуют правилу ограничения, они будут вставлены успешно. Если вставленные данные нарушают определенное ограничение, операция вставки будет прервана.

Ограничения в SQL Server могут быть определены на уровне столбца, где они указаны как часть определения столбца и будут применяться только к этому столбцу, или объявлены независимо на уровне таблицы. В этом случае правила ограничения будут применяться более чем к одному столбцу в указанной таблице.Ограничение можно создать с помощью команды CREATE TABLE T-SQL при создании таблицы или добавить с помощью команды ALTER TABLE T-SQL после создания таблицы. При добавлении ограничения после создания таблицы существующие данные будут проверяться на соответствие правилу ограничения перед созданием этого ограничения.

Существует шесть основных ограничений, которые обычно используются в SQL Server, которые мы подробно опишем на примерах в этой и следующей статье. Эти ограничения:

  • SQL NOT NULL
  • УНИКАЛЬНЫЙ
  • ОСНОВНОЙ КЛЮЧ
  • ВНЕШНИЙ КЛЮЧ
  • ПРОВЕРЯТЬ
  • ПО УМОЛЧАНИЮ

В этой статье мы рассмотрим первые три ограничения; SQL NOT NULL, UNIQUE и SQL PRIMARY KEY, а остальные три ограничения мы завершим в следующей статье.Давайте начнем обсуждение каждого из этих ограничений SQL Server с краткого описания и практической демонстрации.

Ограничение NOT NULL в SQL

По умолчанию столбцы могут содержать значения NULL. Ограничение NOT NULL в SQL используется для предотвращения вставки значений NULL в указанный столбец, считая его недопустимым значением для этого столбца. Это означает, что вы должны предоставить допустимое значение SQL NOT NULL для этого столбца в операторах INSERT или UPDATE, поскольку столбец всегда будет содержать данные.

Предположим, что у нас есть приведенный ниже простой оператор CREATE TABLE, который используется для определения таблицы ConstraintDemo1. Эта таблица содержит только два столбца: ID и Имя. В операторе определения столбца идентификатора принудительно применяется ограничение уровня столбца SQL NOT NULL, учитывая, что столбец идентификатора является обязательным столбцом, которому должно быть предоставлено допустимое значение SQL NOT NULL. Случай отличается для столбца Name, который можно игнорировать в инструкции INSERT, с возможностью предоставить ему значение NULL.Если при определении столбца не указана возможность NULL, по умолчанию он примет значение NULL:

ИСПОЛЬЗОВАТЬ SQLShackDemo

GO

СОЗДАТЬ ТАБЛИЦУ ConstraintDemo1

(

ID INT NOT NULL,

Имя VARCHAR (50) NULL

)

Если мы попытаемся выполнить следующие три операции вставки:

INSERT INTO ConstraintDemo1 ([ID], [NAME]) VALUES (1, ‘Ali’)

GO

INSERT INTO ConstraintDemo1 ([ID]) ЗНАЧЕНИЯ (2)

GO

INSERT INTO Constraint ( [ИМЯ]) ЗНАЧЕНИЯ (‘Fadi’)

GO

Вы увидите, что первая запись будет успешно вставлена, поскольку значения столбцов ID и Name указаны в инструкции INSERT.Указание ID только во втором операторе INSERT не помешает успешному завершению процесса вставки, поскольку столбец Name не является обязательным и принимает значения NULL. Последняя операция вставки завершится ошибкой, поскольку мы предоставляем только инструкцию INSERT со значением для столбца Name, без указания значения для столбца ID, которое является обязательным и не может быть присвоено значение NULL, как показано в сообщении об ошибке ниже:

Проверив вставленные данные, вы увидите, что вставлены только две записи, а отсутствующее значение для столбца Name во втором операторе INSERT будет NULL, что является значением по умолчанию, как показано в результате ниже:

Предположим, что нам нужно запретить столбцу Name в предыдущей таблице принимать значения NULL после создания таблицы, используя оператор ALTER TABLE T-SQL ниже:

ALTER TABLE ConstraintDemo1 ALTER COLUMN [Имя] VARCHAR (50) NOT NULL

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

Чтобы обеспечить соблюдение ограничений NOT NULL в SQL, мы должны удалить все значения NULL столбца Name из таблицы, используя оператор UPDATE ниже, который заменяет значения NULL пустой строкой:

ОБНОВЛЕНИЕ ConstraintDemo1 SET [Name] = » WHERE [Name] IS NULL

Если вы снова попытаетесь создать ограничения в SQL, он будет успешно создан, как показано ниже:

Ограничение SQL NOT NULL также можно создать с помощью SQL Server Management Studio, щелкнув правой кнопкой мыши нужную таблицу и выбрав параметр «Дизайн».Рядом с каждым столбцом вы найдете небольшой флажок, который вы можете использовать, чтобы указать возможность нулевого значения этого столбца. Если снять флажок рядом со столбцом, автоматически будет создано ограничение SQL NOT NULL, предотвращающее вставку любого значения NULL в этот столбец, как показано ниже:

УНИКАЛЬНЫЕ ограничения в SQL

Ограничение UNIQUE в SQL используется, чтобы гарантировать, что никакие повторяющиеся значения не будут вставлены в конкретный столбец или комбинацию столбцов, которые участвуют в ограничении UNIQUE, а не являются частью ПЕРВИЧНОГО КЛЮЧА.Другими словами, индекс, который автоматически создается при определении ограничения UNIQUE, гарантирует, что никакие две строки в этой таблице не могут иметь одинаковое значение для столбцов, участвующих в этом индексе, с возможностью вставки только одного уникального значения NULL в эти столбцы, если столбец допускает NULL.

Давайте создадим небольшую таблицу с двумя столбцами, ID и Name. Столбец ID не может содержать повторяющиеся значения из-за ограничения UNIQUE, указанного в определении столбца.Для столбца Name не задано никаких ограничений, как в операторе CREATE TABLE T-SQL ниже:

ИСПОЛЬЗОВАТЬ SQLShackDemo

GO

СОЗДАТЬ ТАБЛИЦУ ConstraintDemo2

(

ID INT UNIQUE,

Имя VARCHAR (50) NULL

)

Если мы попытаемся запустить четыре инструкции INSERT ниже:

INSERT INTO ConstraintDemo2 ([ID], [NAME]) VALUES (1, ‘Ali’)

GO

INSERT INTO ConstraintDemo2 ([ID], [NAME]) VALUES (2, ‘Ali’)

GO

INSERT INTO ConstraintDemo2 ([ID], [NAME]) VALUES (NULL, ‘Adel’)

GO

INSERT INTO ConstraintDemo2 ([ID], [NAME]) VALUES (1, ‘Faris’)

ГО

Первые две записи будут вставлены успешно, без каких-либо ограничений, предотвращающих дублирование значений столбца Name.Третья запись также будет успешно вставлена, поскольку столбец уникального идентификатора допускает только одно значение NULL. Последняя инструкция INSERT завершится ошибкой, поскольку столбец идентификатора не допускает повторяющихся значений, а предоставленное значение идентификатора уже вставлено в этот столбец, как показано в сообщении об ошибке ниже:

Три вставленные строки будут такими, как показано ниже:

Системный объект INFORMATION_SCHEMA.TABLE_CONSTRAINTS можно легко использовать для получения информации обо всех определенных ограничениях в конкретной таблице с помощью сценария T-SQL ниже:

SELECT CONSTRAINT_NAME,

TABLE_SCHEMA,

TABLE_NAME,

CONSTRAINT_TYPE

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS

WHERE TABLE_NAME = ‘ConstraintDemo2’

Предыдущий результат запроса покажет определенное ограничение UNIQUE в SQL в предоставленной таблице, что будет иметь вид:

Используя имя ограничения, полученное из системного объекта INFORMATION_SCHEMA.TABLE_CONSTRAINTS, мы можем отбросить ограничение UNIQUE, используя команду ALTER TABLE… DROP CONSTRAINT в SQL T-SQL ниже:

ALTER TABLE ConstraintDemo2 DROP CONSTRAINT [UQ__Constrai__3214EC26B928E528]

Если вы попытаетесь запустить ранее неудачный оператор INSERT, запись с повторяющимся значением идентификатора будет успешно вставлена:

Попытка снова добавить ограничение UNIQUE в SQL с помощью команды T-SQL ALTER TABLE… ADD CONSTRAINT ниже:

ALTER TABLE ConstraintDemo2 ADD CONSTRAINT UQ__Constrai UNIQUE (ID)

GO

Ограничение при создании SQL не будет выполнено из-за наличия повторяющихся значений этого столбца в таблице, как показано в сообщении об ошибке ниже:

При проверке вставленных данных повторяющиеся значения будут очищены, как показано ниже:

Чтобы добавить ограничение UNIQUE, у вас есть выбор: удалить или изменить повторяющиеся значения.В нашем случае мы обновим значение второго повторяющегося идентификатора, используя инструкцию UPDATE ниже:

ОБНОВЛЕНИЕ [SQLShackDemo]. [Dbo]. [ConstraintDemo2] SET ID = 3 WHERE NAME = ‘FARIS’

Теперь ограничение UNIQUE в SQL можно добавить в столбец ID без ошибок, как показано ниже:

Ключ UNIQUE можно просмотреть с помощью SQL Server Management Studio, развернув узел «Ключи» под выбранной таблицей.Вы также можете увидеть автоматически созданный индекс, который используется для обеспечения уникальности значений столбца. Обратите внимание, что вы не сможете удалить этот индекс, не сбросив сначала ограничение UNIQUE:

В дополнение к ранее показанным командам T-SQL ограничение UNIQUE можно также определить и изменить с помощью SQL Server Management Studio. Щелкните правой кнопкой мыши нужную таблицу и выберите «Дизайн». В окне «Дизайн» щелкните это окно правой кнопкой мыши и выберите «Индексы / ключи», откуда вы можете пометить ограничение как УНИКАЛЬНОЕ, как показано ниже:

Ограничение PRIMARY KEY в SQL

Ограничение PRIMARY KEY состоит из одного или нескольких столбцов со значениями, которые однозначно идентифицируют каждую строку в таблице.

Ограничение SQL PRIMARY KEY объединяет ограничения UNIQUE и SQL NOT NULL, когда столбец или набор столбцов, участвующих в PRIMARY KEY, не могут принимать значение NULL. Если PRIMARY KEY определен в нескольких столбцах, вы можете вставить повторяющиеся значения в каждый столбец по отдельности, но значения комбинации всех столбцов PRIMARY KEY должны быть уникальными. Учтите, что вы можете определить только один ПЕРВИЧНЫЙ КЛЮЧ для каждой таблицы, и рекомендуется использовать небольшие столбцы или столбцы INT в ПЕРВИЧНОМ КЛЮЧЕ.

Помимо обеспечения быстрого доступа к данным таблицы, автоматически созданный индекс при определении ПЕРВИЧНОГО КЛЮЧА SQL будет обеспечивать уникальность данных. PRIMARY KEY используется в основном для обеспечения целостности объекта таблицы. Целостность объекта гарантирует, что каждая строка в таблице является однозначно идентифицируемым объектом.

Ограничение PRIMARY KEY отличается от ограничения UNIQUE этим; вы можете создать несколько ограничений UNIQUE в таблице с возможностью определять только один SQL PRIMARY KEY для каждой таблицы.Другое отличие состоит в том, что ограничение UNIQUE допускает одно значение NULL, но PRIMARY KEY не допускает значения NULL.

Предположим, что у нас есть приведенная ниже простая таблица с двумя столбцами; идентификатор и имя. Столбец ID определяется как ПЕРВИЧНЫЙ КЛЮЧ для этой таблицы, который используется для идентификации каждой строки в этой таблице, гарантируя, что в этот столбец ID не будут вставлены значения NULL или повторяющиеся значения. Таблица определяется с помощью сценария CREATE TABLE T-SQL ниже:

ИСПОЛЬЗОВАТЬ SQLShackDemo

GO

CREATE TABLE ConstraintDemo3

(

ID INT PRIMARY KEY,

Имя VARCHAR (50) NULL

)

Если вы попытаетесь выполнить три инструкции INSERT ниже:

INSERT INTO ConstraintDemo3 ([ID], [NAME]) VALUES (1, ‘John’)

GO

INSERT INTO ConstraintDemo3 ([NAME]) VALUES (‘Fadi’)

GO

IN ConstraintDemo3 ([ID], [NAME]) VALUES (1, ‘Saeed’)

GO

Вы увидите, что первая запись будет успешно вставлена, поскольку значения ID и Name действительны.Вторая операция вставки завершится ошибкой, поскольку столбец ID является обязательным и не может иметь значение NULL, поскольку столбец ID является ПЕРВИЧНЫМ КЛЮЧОМ SQL. Последний оператор INSERT также завершится ошибкой, поскольку указанное значение идентификатора уже существует, а повторяющиеся значения не допускаются в ПЕРВИЧНОМ КЛЮЧЕ, как показано в сообщении об ошибке ниже:

Проверив вставленные значения, вы увидите, что только первая запись вставлена ​​успешно, как показано ниже:

Если вы не укажете ограничение SQL PRIMARY KEY с именем во время определения таблицы, SQL Server Engine предоставит ему уникальное имя, как вы можете видеть при запросе INFORMATION_SCHEMA.Системный объект TABLE_CONSTRAINTS ниже:

SELECT CONSTRAINT_NAME,

TABLE_SCHEMA,

TABLE_NAME,

CONSTRAINT_TYPE

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS

WHERE TABLE_NAME0002


С приведенным ниже результатом в нашем примере:

Оператор T-SQL ALTER TABLE… DROP CONSTRAINT можно легко использовать для удаления ранее определенного PRIMARY KEY с использованием имени, полученного из предыдущего результата:

ALTER TABLE ConstraintDemo3

DROP CONSTRAINT PK__Constrai__3214EC27E0BEB1C4;

Если вы попытаетесь выполнить два ранее неудачных оператора INSERT, вы увидите, что первая запись не будет вставлена, поскольку столбец ID не допускает значений NULL.Вторая запись будет успешно вставлена, так как это ничто не препятствует вставке повторяющихся значений после удаления ПЕРВИЧНОГО КЛЮЧА SQL, как показано ниже:

Попытка снова добавить ограничение SQL PRIMARY KEY с помощью запроса ALTER TABLE T-SQL ниже:

ALTER TABLE ConstraintDemo3

ДОБАВИТЬ ПЕРВИЧНЫЙ КЛЮЧ (ID);

Операция завершится ошибкой, так как при первой проверке существующих значений идентификатора на наличие NULL или повторяющихся значений SQL Server находит повторяющееся значение идентификатора 1, как показано в сообщении об ошибке ниже:

Проверка данных таблицы также покажет вам повторяющееся значение:

Чтобы добавить ограничение PRIMARY KEY, мы должны сначала очистить данные, удалив или изменив повторяющуюся запись.Здесь мы изменим значение идентификатора второй записи, используя инструкцию UPDATE ниже:

ОБНОВЛЕНИЕ ConstraintDemo3 SET ID = 2 WHERE NAME = ‘Saeed’

Затем попытайтесь добавить ПЕРВИЧНЫЙ КЛЮЧ SQL, который теперь будет успешно создан:

Ограничение SQL PRIMARY KEY также можно определить и изменить с помощью SQL Server Management Studio.Щелкните таблицу правой кнопкой мыши и выберите «Дизайн». В окне «Дизайн» щелкните правой кнопкой мыши столбец или набор столбцов, которые будут участвовать в ограничении PRIMARY KEY и опции Set PRIMARY KEY , которая автоматически снимет флажок Разрешить NULL, как показано ниже:

Пожалуйста, ознакомьтесь со следующей статьей из серии Часто используемые ограничения SQL Server: FOREIGN KEY, CHECK и DEFAULT, в которой описаны три других ограничения SQL Server.

Полезные ссылки

Ахмад Ясин (Ahmad Yaseen) — инженер Microsoft по большим данным с глубокими знаниями и опытом в областях SQL BI, администрирования баз данных SQL Server и разработки.

Он является сертифицированным специалистом по решениям Microsoft в области управления данными и аналитикой, сертифицированным партнером по решениям Microsoft в области администрирования и разработки баз данных SQL, партнером разработчика Azure и сертифицированным инструктором Microsoft.

Кроме того, он дает свои советы по SQL во многих блогах.

Посмотреть все сообщения от Ahmad Yaseen

Последние сообщения от Ahmad Yaseen (посмотреть все)

Примеры уникального индекса SQL Server

Назад к: Учебное пособие по SQL Server для начинающих и профессионалов

Уникальный индекс SQL Server

В этой статье я собираюсь обсудить SQL Server Unique Index с примерами.Когда мы создаем индекс SQL Server с помощью параметра «Уникальный», он называется уникальным индексом SQL Server. Тогда столбцы, в которых создается уникальный индекс, не допускают повторяющихся значений, т.е. они работают как уникальное ограничение.

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

Индексы SQL Server

Кластерный индекс в SQL Server

Некластеризованные индексы в SQL Server

Давайте разберемся с уникальным индексом SQL Server на примере.

Мы собираемся использовать следующую таблицу сотрудников. Используйте следующий сценарий SQL для создания и заполнения таблицы «Сотрудники» тестовыми данными.

 CREATE TABLE Сотрудники
(
  Id INT ПЕРВИЧНЫЙ КЛЮЧ,
  FastName VARCHAR (30),
  Фамилия VARCHAR (30),
  Зарплата INT,
  Пол VARCHAR (30),
  Город ВАРЧАР (30)
)
 

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

sp_helpindex Сотрудники

Из приведенной выше диаграммы ясно видно, что уникальный кластерный индекс создается в столбце Id таблицы «Сотрудники». Поскольку у нас есть УНИКАЛЬНЫЙ КЛАСТЕРИРОВАННЫЙ ИНДЕКС в столбце Id таблицы Employees, любая попытка дублировать значения ключей, то есть значения столбца Id таблицы Employee, вызовет ошибку.

Давайте попробуем вставить две записи с одинаковыми значениями Id, как показано ниже.

ВСТАВИТЬ ЗНАЧЕНИЯ сотрудников (1, «Праная», «Маршрут», 4500, «Мужской», «Мумбаи»)

ВСТАВИТЬ ЗНАЧЕНИЯ сотрудников (1, «Anurag», «Mohanty», 2500, «Male», «Delhi»)

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

’Нарушение ограничения PRIMARY KEY‘ PK__Employee__3214EC0775FF9526 ’.Невозможно вставить повторяющийся ключ в объект «dbo.Employees». Повторяющееся значение ключа: (1) ’.

Теперь давайте попробуем отбросить уникальный кластерный индекс в столбце Id с помощью команды DROP, как показано ниже.

DROP INDEX Employees.PK__Employee__3214EC0775FF9526

Когда мы пытаемся выполнить указанную выше команду DROP INDEX , она дает нам следующую ошибку:

«Явный DROP INDEX не разрешен для индекса« Сотрудники.PK__Employee__3214EC0775FF9526 ′. Он используется для принудительного применения ограничений PRIMARY KEY. ’

Таким образом, приведенное выше сообщение об ошибке доказывает, что SQL-сервер внутренне использует индекс UNIQUE для обеспечения уникальности значений и первичного ключа.

Чтобы увидеть первичный ключ и индекс, разверните папку ключей в окне обозревателя объектов, и вы увидите ограничение первичного ключа. Аналогичным образом разверните папку индексов в окне проводника объектов, и вы увидите уникальный кластерный индекс, как показано на диаграмме ниже.

Как вы можете видеть в проводнике объектов, он показывает только сгруппированные слова. Чтобы подтвердить, является ли это УНИКАЛЬНЫМ индексом или нет, щелкните индекс правой кнопкой мыши и выберите свойства. В окне свойств отображается установленный флажок UNIQUE, как показано на диаграмме ниже.

DELETE Clustered Index

Мы не можем удалить уникальный кластерный индекс с помощью команды DROP, но SQL Server позволяет нам удалить UNIQUE CLUSTERED INDEX из проводника объектов.Итак, щелкните правой кнопкой мыши индекс, затем выберите опцию DELETE и, наконец, щелкните OK . Вы можете видеть, что вместе с индексом UNIQUE также удаляется ограничение первичного ключа.

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

ВСТАВИТЬ ЗНАЧЕНИЯ сотрудников (2, «Приянка», «Двегаан», 4500, «Женский», «Мумбаи»)

ВСТАВИТЬ ЗНАЧЕНИЯ сотрудников (2, «Preety», «Tiwary», 2500, «FEmale», «Delhi»)

После того, как вы вставите две вышеуказанные записи, проверьте таблицу сотрудников, как показано ниже.

ВЫБРАТЬ * ИЗ сотрудников

Вывод:

Таким образом, это доказывает, что индекс UNIQUE в SQL Server используется для обеспечения уникальности значений и ограничения первичного ключа.

УНИКАЛЬНОСТЬ — это свойство индекса в SQL Server, и как КЛАСТЕРИРОВАННЫЕ, так и НЕКЛАСТЕРНЫЕ индексы могут быть созданы как УНИКАЛЬНЫЕ.

ПРИМЕЧАНИЕ:

Мы не можем создать уникальный индекс для одного столбца, если этот столбец содержит NULL в более чем одной строке.Точно так же мы не можем создать уникальный индекс для нескольких столбцов, если комбинация столбцов содержит NULL в более чем одной строке. Они рассматриваются как повторяющиеся значения для целей индексации.

Давайте создадим уникальный некластеризованный индекс для столбцов FirstName и LastName таблицы «Сотрудники».

СОЗДАТЬ УНИКАЛЬНЫЙ НЕКЛАСТЕРНЫЙ ИНДЕКС UIX_Employees_FastNamee_LastName для сотрудников (FastName, LastName)

Указанный выше уникальный некластеризованный индекс гарантирует, что никакие 2 записи в индексе не имеют одинаковых быстрых имен и фамилий.

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

ПРИМЕЧАНИЕ. Уникальное ограничение в SQL Server может быть уникальным кластеризованным или уникальным некластеризованным. При создании индекса в SQL Server, если кластеризованный или некластеризованный не указан по умолчанию, он не кластеризован.

В чем разница между ограничениями UNIQUE и индексом UNIQUE?

Нет существенных различий между ограничением уникальности и уникальным индексом в SQL Server.Фактически, когда мы добавляем уникальное ограничение, уникальный индекс создается за кулисами.

Чтобы понять это, давайте добавим уникальное ограничение в столбец «Город» таблицы «Сотрудники»

ALTER TABLE Сотрудники ДОБАВИТЬ ОГРАНИЧЕНИЕ UQ_Emplyees_City UNIQUE (Город)

Теперь, когда мы выполняем вышеуказанный запрос, он дает нам ошибку ниже.

Оператор CREATE UNIQUE INDEX прерван, так как для имени объекта «dbo.Employees» и имени индекса «UQ_Emplyees_City» был найден повторяющийся ключ.Повторяющееся значение ключа — (Мумбаи).

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

Итак, давайте сначала обрежем таблицу, а затем создадим индекс, как показано ниже.

TRUNCATE TABLE Сотрудники

ALTER TABLE Сотрудники ДОБАВИТЬ ОГРАНИЧЕНИЕ UQ_Emplyees_City UNIQUE (Город)

Теперь инструкция выполнена успешно.

На этом этапе вы можете ожидать создания уникального ограничения в папке ограничений. Обновите и разверните папку ограничений в окне обозревателя объектов, и вы увидите, что ограничение отсутствует в этой папке. Теперь обновите и разверните папку «indexes», а в папке indexes вы увидите УНИКАЛЬНЫЙ НЕКЛАСТЕРИРОВАННЫЙ индекс с именем UQ_Employees_City , как показано ниже.

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

EXECUTE SP_HELPCONSTRAINT Сотрудники

Это даст нам результат ниже.

Когда мы создаем ограничение UNIQUE в SQL Server, оно фактически создает индекс UNIQUE за сценой. Таким образом, индекс UNIQUE в SQL Server может быть создан явно с помощью оператора CREATE INDEX или косвенно с помощью ограничения UNIQUE.

Когда следует создавать уникальное ограничение для уникального индекса?

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

ПРИМЕЧАНИЕ:

Когда мы создаем ограничение PRIMARY KEY в SQL Server, уникальный кластеризованный индекс для столбца или столбцов создается автоматически, если кластеризованный индекс в таблице еще не существует и мы не указываем уникальный некластеризованный индекс.

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

Мы не можем создать ограничение UNIQUE или UNIQUE Index в SQL Server для существующей таблицы, если таблица содержит повторяющиеся значения в ключевых столбцах. Чтобы решить эту проблему, вам необходимо удалить ключевые столбцы из определения индекса или удалить или обновить повторяющиеся значения.

По умолчанию повторяющиеся значения не допускаются в ключевых столбцах, если у вас есть уникальный индекс или ограничение. Например, если вы попытаетесь вставить 10 строк, из которых 5 содержат дубликаты, то все 10 строк будут отклонены.Однако, если я хочу, чтобы отклонялись только 5 повторяющихся строк и принимали не повторяющиеся 5 строк, я могу использовать опцию IGNORE_DUP_KEY. Пример использования опции IGNORE_DUP_KEY показан ниже.

СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС IX_Employees_City НА Сотрудниках (Город) С IGNORE_DUP_KEY

Ограничения и ограничения

Уникальный индекс, ограничение UNIQUE или ограничение PRIMARY KEY не могут быть созданы, если в данных существуют повторяющиеся значения ключа.

Уникальный некластеризованный индекс может содержать включенные неключевые столбцы

В следующей статье я расскажу, как использовать индекс в предложении GROUP BY в SQL Server с примерами.

РЕЗЮМЕ

В этой статье я попытаюсь объяснить SQL Server Unique Index шаг за шагом с некоторыми примерами. Я надеюсь, что эта статья поможет вам в ваших нуждах. Я хотел бы услышать ваш отзыв. Пожалуйста, оставьте свой отзыв, вопрос или комментарий об этой статье.

UNIQUE Column с несколькими значениями NULL — DatabaseJournal.com

Как вы знаете, когда вы создаете ограничение UNIQUE для столбца, допускающего значение NULL, SQL Server допускает только одно значение NULL, тем самым сохраняя УНИКАЛЬНОСТЬ.Однако бывают ситуации, когда нам нужно более одного значения NULL в столбце, но все же необходимо поддерживать уникальность, игнорируя все эти значения NULL.

В этой статье я собираюсь проиллюстрировать, как сохранить уникальность столбца, а также разрешить несколько значений NULL.

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

 ИСПОЛЬЗОВАНИЕ [master]
ИДТИ
ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ имя ИЗ sys.databases WHERE name = N'Employee ')
DROP DATABASE [Сотрудник]
идти
Создать базу данных [Сотрудник]
идти
используйте [Сотрудник]
идти

Создать таблицу Emp
([Идентификатор сотрудника] int not NULL ограничение первичного ключа Emp_pk кластеризовано,
[Имя] varchar (100) NULL,
[Фамилия] varchar (100) NULL,
[Ник] varchar (100) NULL,
[Номер социального страхования] int NULL)
идти
 

Мы знаем, что номер социального страхования уникален, поэтому давайте добавим ограничение UNIQUE в столбец [Номер социального страхования].

 Изменить таблицу Emp Добавить ограничение ssn_unique UNIQUE
 ([Номер социального страхования]) 

Теперь давайте попробуем вставить данные, как показано ниже.

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (1, 'Роберт', 'Бейтс', 'Боб', 111213422)

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
values ​​(2, 'Роберт', 'Бейтс', 'Боб', 121213422)

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (3, 'Роберт', 'Уильям', 'Роб', 131213422)

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (4, 'Sonia', 'Keira', 'Sony', 131413426)
 

Как известно, номер социального страхования уникален.Однако в ситуациях, когда люди въезжают в эту страну по рабочей визе, им потребуется некоторое время, чтобы получить номер социального страхования. До этого времени данные были бы NULL.

Теперь давайте попробуем вставить одну строку без номера социального страхования, как показано ниже.

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (5, 'Mellisa', 'Brown', 'Mel', NULL)

  Результат 
(Затронута 1 строка (и))
 

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

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (6, 'Sibey', 'Chikhs', 'Ciby', NULL)

  Результат 

Msg 2627, уровень 14, состояние 1, строка 1
Нарушение ограничения UNIQUE KEY 'ssn_unique'.
 Невозможно вставить повторяющийся ключ в объект 'dbo.Emp'.
Заявление было прекращено.
 

Это нормальное поведение ограничения UNIQUE для столбца NULL. Это позволяет одну строку данных со значениями NULL. Однако это не то поведение, которое мы хотим для этого столбца.Мы хотим, чтобы столбец принимал уникальные значения, а также несколько значений NULL.

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

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

 ИСПОЛЬЗОВАНИЕ [master]
ИДТИ
ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ имя ИЗ sys.databases WHERE name = N'Employee ')
DROP DATABASE [Сотрудник]
идти
Создать базу данных [Сотрудник]
идти
используйте [Сотрудник]
идти

Создать таблицу Emp
([Идентификатор сотрудника] int not NULL ограничение первичного ключа Emp_pk кластеризовано,
[Имя] varchar (100) NULL,
[Фамилия] varchar (100) NULL,
[Ник] varchar (100) NULL,
[Номер социального страхования] int NULL)
идти

Измените таблицу Emp. Добавьте MySSN, если [Номер социального страхования]
 равно NULL, тогда [Идентификатор сотрудника] иначе [Номер социального страхования] конец
идти
 

Теперь давайте добавим ограничение UNIQUE к вычисляемому столбцу, как показано ниже.

 Изменить таблицу Emp Добавить ограничение ssn_unique UNIQUE ([MySSN])
идти
 

Теперь давайте попробуем вставить данные, как показано ниже.

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (1, 'Роберт', 'Бейтс', 'Боб', 111213422)

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
values ​​(2, 'Роберт', 'Бейтс', 'Боб', 121213422)

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (3, 'Роберт', 'Уильям', 'Роб', 131213422)

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (4, 'Sonia', 'Keira', 'Sony', 131413426)
 

Давайте попробуем вставить одну строку без номера социального страхования, как показано ниже.

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (5, 'Mellisa', 'Brown', 'Mel', NULL)

  Результат 
(Затронута 1 строка (и))

 

Попробуйте вставить другую строку без номера социального страхования:

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (6, 'Sibey', 'Chikhs', 'Ciby', NULL)

  Результат 
(Затронута 1 строка (и))
 

Если столбец Social Security Number является столбцом varchar, то мы можем создать вычисляемый столбец и ограничение, как показано ниже, чтобы достичь той же цели — иметь неоднородность с несколькими значениями NULL.

 ИСПОЛЬЗОВАНИЕ [master]
ИДТИ
ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ имя ИЗ sys.databases WHERE name = N'Employee ')
DROP DATABASE [Сотрудник]
идти
Создать базу данных [Сотрудник]
идти
используйте [Сотрудник]
идти

Создать таблицу Emp
([Идентификатор сотрудника] int not NULL ограничение первичного ключа Emp_pk кластеризовано,
[Имя] varchar (100) NULL,
[Фамилия] varchar (100) NULL,
[Ник] varchar (100) NULL,
[Номер социального страхования] varchar (12) NULL)
идти
 

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

 Изменить таблицу Emp Добавьте MySSN в случае, когда [Номер социального страхования]
 равно NULL, затем преобразовать (varchar (12), [Employee id]) else [Номер социального страхования] end
идти
 

Теперь давайте добавим ограничение UNIQUE к вычисляемому столбцу:

 Изменить таблицу Emp Добавить ограничение ssn_unique UNIQUE ([MySSN])
идти 

Давайте попробуем вставить данные, как показано ниже.

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (1, 'Роберт', 'Бейтс', 'Боб', '111-21-3422')

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (2, 'Роберт', 'Бейтс', 'Боб', '121-21-3422')

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (3, 'Роберт', 'Уильям', 'Роб', '131-21-3422')

Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (4, 'Sonia', 'Keira', 'Sony', '131-41-3426')
 

Теперь попробуйте вставить одну строку без номера социального страхования:

 Вставить в Emp ([Идентификатор сотрудника], [Имя], [Фамилия],
[Ник], [Номер социального страхования])
значения (5, 'Mellisa', 'Brown', 'Mel', NULL)

  Результат 
(Затронута 1 строка (и))
 

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

2024 © Все права защищены. Карта сайта