Как использовать уникальный составной ключ - PullRequest
5 голосов
/ 15 января 2011

У меня есть таблица

Item(ItemName*, ItemSize*, Price, Notes)

Я создавал составной ключ (ItemName, ItemSize) для уникальной идентификации элемента.И теперь, после прочтения некоторых ответов на стеке потока, предлагающих использовать UNIQUE, я изменил его как

Item(ItemID*, ItemName, ItemSize, Price, Notes)

Но как применить ограничение UNIQUE для ItemName и ItemSize

, пожалуйста, исправьте, если естьчто-то не так в вопросе

Ответы [ 3 ]

10 голосов
/ 15 января 2011
ALTER TABLE Items ADD UNIQUE INDEX(ItemName, ItemSize);

и вот статья , объясняющая, как добиться того же с помощью SQL Server Management Studio.

1 голос
/ 15 января 2011
  1. Вы зависаете на One Tool, чтобы выполнить задачу.Без понимания того, что:

    • , как утверждает Дарин, в конце дня SQL является символьным языком
    • любой и всех команд (манипулирование данными или определение данных, как вв данном случае), выполняются на сервере SQL в виде символьных строк
    • . Существует более ста инструментов администрирования SQL Server с графическим интерфейсом, от мусора, который MS выпускает раз в два года, до зрелых продуктов, которые продолжают расти (незаменен или переписан)
    • вы можете щелкнуть или перетащить или что-нибудь еще в любом графическом интерфейсе, который вы используете, но когда вы нажимаете кнопку «сохранить» или «применить», все делают одно и то же: отправляют строку символов SQLSQL-сервер для обработки

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

  2. SQL существует уже более 30 лет, и он прошел долгий путь (он все еще очень ограничен, но этоздесь не актуально).В старые времена у нас был только синтаксис
    {DROP|CREATE} [UNIQUE] [CLUSTERED] INDEX name ON table (columns, ...)
    .По мере расширения было добавлено больше реляционных конструкций, и у нас есть синтаксис
    ALTER TABLE table {ADD|DROP} {UNIQUE|PRIMARY KEY} CONSTRAINT name (columns,...)
    .

    Дейв Пинал верен на одном уровне: с точки зрения структур хранения данных внутри сервера, обаСинтаксисы INDEX и CONSTRAINT приводят к одному и тому же результату, индексу.

    Но он просто отвечает на вопрос и, очевидно, не слышал о характеристиках SQL стандарта ISO / IEC / ANSI, которые подразумеваются вболее новый синтаксис CONSTRAINT, который не подразумевается в синтаксисе INDEX (если вы его используете, вы должны явно указать эти параметры).Что еще более важно, есть много параметров, которые могут быть предоставлены в синтаксисе INDEX, которые отсутствуют в синтаксисе CONSTRAINT.Таким образом, существуют значительные различия, которые могут не относиться к небольшим серверам, работающим в состоянии по умолчанию.

    Обычно люди, склонные к производительности на физическом уровне или имеющие сотни таблиц для администрирования, используют синтаксис INDEX;и люди, которые дистанцируются от физического нас CONSTRAINT.

    • Смысл в том, что используйте один XOR другой, не используйте комбинацию: это приводит к созданию дублирующих индексов, о которых вы даже не знаете (потому что они не отображаются в сломанном графическом интерфейсе MSпанель, на которую вы смотрите).
      .

    Дейв путает вещи: не существует такого понятия, как «индекс первичного ключа».Это или ограничение основного ключа или индекс (который может быть основным ключом и имеет настройку, относящуюся к поддержке PK) ..

  3. Следующее, что смущает любого, новичка или кого-то еще, это то, что вы привыкли видеть все виды забавных рисунков, которые должны изображать модели данных или данных, а они нет.MS - худший нарушитель, в каждом отдельном продукте есть совершенно другая забавная схема и набор символов.Там нет общности или стандарта;Есть символы, которые изображают важный аспект дизайна, на одном изображении, которое вы можете захотеть на другом изображении, и вы не можете его получить.

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

    • Суть в том, что вы должны изучить стандарты, и это поможет вам избежать путаницы.Затем, независимо от того, какой инструмент GUI у вас есть на вашем экране сегодня, вы будете знать, что вы явно хотите / имеете в своей модели данных, и что происходит внутри сервера.

    • Дело в том, что «как я делаю это графически», вы делаете это в любом инструменте построения диаграмм, потому что вы являетесь владельцем модели, и вы выбираете настройки в таблицах. Никакой MS GUI никогда не давал и не даст вам этого.
      ,

    Графический интерфейс не заменяет знания.

  4. Не могли бы вы объяснить: если, как вы говорите, (ItemName, ItemSize) образует уникальный ключ для этой конкретной таблицы, на каком основании, по вашему мнению, вам нужно вместо (ItemName, ItemSize плюс что-нибудь еще )? Как вы можете получить больше уникального, чем уникального?

0 голосов
/ 12 июля 2014
ALTER TABLE Items ADD CONSTRAINT uc_name_size UNIQUE (ItemName,ItemSize)

ссылка от oracle и postgres doc

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