Запросы на составной ПК - PullRequest
0 голосов
/ 19 ноября 2011

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

Создание таблицы:

Create table test
(
testno number(5) not null,
testpaper varchar(2) not null,
time date
CONSTRAINT Pa_Pks PRIMARY KEY (testno, testpaper) 
)

Тогда вот значения, которые я хотел бы вставить:

Testno          Testpaper         Time
12345           22                14-JUL-2011
12345           23                15-JUL-2011
12345           22                16-JUL-2011

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

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

Это должен быть стандартный и правильный способ сделать это:

Create table TEST
(
 Testid number(1) not null,
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date
 CONSTRAINT Pa_Pks PRIMARY KEY (Testid) 
)

Спасибо за любые разъяснения.

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Нет, вы не можете этого сделать, первичный ключ должен быть уникальным.Однако вы можете добавить время тестирования как часть ключа.Или вы можете использовать другое имя столбца в качестве идентификатора, это будет ключ автоматического увеличения.Таким образом, ваш первичный ключ будет ID (автоинкремент).

В oracle, если вы хотите иметь ключ AutoIncrement, вам придется написать последовательность и триггер также.Последовательность - это просто серия чисел.Целью триггера будет увеличивать число всякий раз, когда вставляется новая строка, и сохранять его в идентификаторе столбца.И вы также можете увеличить размер номера.Число (1) может быть недостаточно хорошего размера для первичного ключа. (Если вы хотите, чтобы у Oracle был Id с автоматическим приращением) ИЛИ Простое, вы можете добавить Время к первичному ключу.

Стандарт зависит от ваших требований.Оба подхода соблюдаются.

0 голосов
/ 21 ноября 2011

Если time обнуляемо, то оно не может быть частью PRIMARY KEY, но может быть частью ограничения e UNIQUE. Обратите внимание, что ключ - это ключ, и обозначение ключа как «первичного» является произвольным и необязательным.

Добавление Testid в качестве суррогатного ключа будет работать только тогда, когда у вас есть естественный ключ для начала. Поэтому:

ЛИБО только натуральный ключ:

Create table TEST
(
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);

ИЛИ натуральный ключ плюс суррогатный ключ:

Create table TEST
(
 Testid number(1) not null,
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Pks PRIMARY KEY (Testid), 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);
...