Запросы на составной ПК

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

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

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 ответа

Решение

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

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

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

Если time обнуляется, то он не может быть частью PRIMARY KEY но это может быть частью е 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) 
);
Другие вопросы по тегам