SQL - Могу ли я основать первичный ключ таблицы более чем на одном поле, требуя уникальности первого ИЛИ второго значения? - PullRequest
1 голос
/ 16 июля 2011

Допустим, у нас есть каталог продукции.Таблица имеет следующие поля: CompanyID и ProductID.Я хочу, чтобы первичный ключ таблицы основывался на этих двух полях, чтобы запись была уникальной, если ее пара полей CompanyID и ProductID имеет уникальные значения.Для ясности: запись CID = 1 и PID = 10 может сосуществовать с записью CID = 2 и PID = 10 (две компании могут пожелать иметь продукт, помеченный одним и тем же идентификатором, верно?), Поэтому запись тоже можетCID = 1 и PID = 9. Конечно, две записи с значениями CID = 1 и PID = 10 не могут сосуществовать.Я не хочу вводить другой столбец с уникальным идентификатором записи, потому что я хочу, чтобы эти правила применялись без создания уровня C #, проверяющего целостность.Я надеюсь, что это понятно, я пытался быть ясным, но я как-то не могу найти слов, чтобы описать это.

Ответы [ 5 ]

3 голосов
/ 16 июля 2011

Да, первичный ключ в двух столбцах делает то, что вы хотите. Просто попробуйте.

1 голос
/ 16 июля 2011

Да, PRIMARY KEY(CompanyID,ProductID), хотя для правильной работы ни один столбец не должен быть обнуляемым.

0 голосов
/ 16 июля 2011

Любой из них будет работать для вашей таблицы ПРОДУКТОВ:

                table: PRODUCTS1
                id autoincrementing integer primary key
                company int
                product int
                productname
                etc

                with a unique composite index on (company,product)

или

                table: PRODUCTS2
               company int
               product int
               productname

               (company, product) composite primary key

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

                      table: OrderDetail
                      orderdetailid int pk
                      orderheaderid int   --foreign key references ORDERHEADER(id)
                      company
                      product
                      quantity
                      etc

                     -- foreign key (company,product) references PRODUCTS2(company,product)

но это будет проще для запросов и в коде графического интерфейса пользователя:

                      table: OrderDetail
                      orderdetailid int pk
                      orderheaderid int  --foreign key references ORDERHEADER(id)
                      productid  --here the foreign key references PRODUCTS1(id)
                      quantity
                      etc

Я не уверен, что вы подразумеваете под

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

Эти ограничения / индексы могут быть созданы в самой базе данных, и база данных будет применять правила; ваша клиентская программа на C # не будет применять эти правила, а просто сообщит об ошибках, сгенерированных базой данных, когда будут предприняты попытки нарушить правила Первый подход, PRODUCTS1, где у вас есть отдельный первичный ключ с автоинкрементом, дает вам простой дескриптор строки, а также обеспечивает соблюдение желаемого правила уникальности из двух столбцов. Это обычная практика.

0 голосов
/ 16 июля 2011

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

0 голосов
/ 16 июля 2011

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

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

...