Запросы на составной ПК
При использовании соединения ПК может ли вставка значений быть одинаковой? Я проиллюстрирую вам пример, ребята:
Создание таблицы:
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)
);