SQL - 2 основных ключа в 1 таблице - PullRequest
0 голосов
/ 02 декабря 2018

Я исследую эту проблему уже несколько недель, и, несмотря на ресурсы на этом и других сайтах, я не могу найти подходящих примеров, которые могли бы привести меня в правильном направлении.Для задания я пытаюсь создать таблицу в SQL, содержащую два PK.Теперь я понимаю, что это невозможно, но я не могу понять, почему, главным образом потому, что это требовалось от меня.Я попытался изменить свой код и разделить ключи, но мне сказали, что это неправильно и придерживался двух ПК.Любая помощь или направление будет принята с благодарностью.Вот мой текущий код для таблицы:

SQL> CREATE TABLE solds_ss /* This is creating the SOLDS table from the instance charts */
2      (
3           invoice_no     NUMBER(7)
4              CONSTRAINT invoice_no_pk PRIMARY KEY,
5              CONSTRAINT invoice_no_fk
6                 FOREIGN KEY (invoice_no)
7                 REFERENCES invoices_ss (invoice_no),
8           item_no     NUMBER(6)
9           CONSTRAINT item_no_pk PRIMARY KEY,
10             CONSTRAINT item_no_nn NOT NULL,
11             CONSTRAINT item_no_fk
12                FOREIGN KEY (item_no)
13                REFERENCES items_ss (item_no),
14          item_qty_sold     NUMBER(3)
15             CONSTRAINT item_qty_sold_nn NOT NULL,
16          item_price     NUMBER(6,2)
17             CONSTRAINT item_price_nn NOT NULL,
18          item_tracking_no     VARCHAR2(30)
19             CONSTRAINT item_tracking_no_nn NOT NULL
20     );
     CONSTRAINT item_no_pk PRIMARY KEY,
     *
ERROR at line 9:
ORA-02260: table can have only one primary key

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

Первичный ключ имеет три свойства:

  1. Он не может быть обнулен.
  2. Он уникален.
  3. Он никогда не меняется.

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

  1. Дайте ограничение NOT NULL для столбцов.
  2. Создайте УНИКАЛЬНОЕ ограничение для столбцов.
  3. Покляните на стопку упаковщиков батончиков Херши (шоколад священный! :-) что вы никогда, никогда не будете изменять значение любого из столбцов в вашем ограничении.Если вы хотите, чтобы это было выполнено, вы можете сделать это с помощью триггера.
0 голосов
/ 02 декабря 2018

Ограничение первичного ключа обозначает столбец в качестве первичного ключа таблицы или представления.Составной первичный ключ обозначает комбинацию столбцов в качестве первичного ключа .

Oracle не допускает использование нескольких первичных ключей в таблице или представлении.Ищите Ограничения первичного ключа https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm

0 голосов
/ 02 декабря 2018

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

InvoiceNo ItemNo
Inv1      Itm1
Inv1      Itm2
Inv2      Itm1
Inv2      Itm2

Данные таблицы выше не будутбудет разрешено, если InvoiceNo был первичным ключом или ItemNo был первичным ключом (каждый столбец содержит повторяющиеся значения при просмотре в изоляции), но разрешено, если первичный ключ определен как InvoiceNo и ItemNo в комбинации

Следовательно, ядумаю, что sql вы ищете больше похоже на:

 CREATE TABLE solds_ss /* This is creating the SOLDS table from the instance charts */
 (
      invoice_no     NUMBER(7) NOT NULL,
      item_no     NUMBER(6) NOT NULL,
      item_qty_sold     NUMBER(3) NOT NULL,
      item_price     NUMBER(6,2) NOT NULL,
      item_tracking_no     VARCHAR2(30) NOT NULL,

         CONSTRAINT invoice_no_fk
            FOREIGN KEY (invoice_no)
            REFERENCES invoices_ss (invoice_no),
         CONSTRAINT item_no_fk
            FOREIGN KEY (item_no)
            REFERENCES items_ss (item_no),

         --composite pk
         CONSTRAINT solds_ss_pk PRIMARY KEY (invoice_no, item_no)

 );
0 голосов
/ 02 декабря 2018

Вы не можете создать два первичных ключа.Первичные ключи имеют три свойства:

  • Они уникальны.
  • Они не равны NULL.
  • В таблице имеется только одно.

Это третье свойство, которое мешает вам иметь два из них.Вы можете объявить один столбец или группы столбцов как unique и not null.Но только один такой набор ключей может быть первичным ключом.

...