Вставка данных в таблицу в Oracle 10g - PullRequest
1 голос
/ 04 ноября 2011

Я использовал следующий скрипт для создания таблицы в oracle

CREATE TABLE  STAFF_LVL 
   (
    STAFF_LEVEL NUMBER(1,0), 
    MANAGER VARCHAR2(10), 
    OPERATOR VARCHAR2(10), 
    ENGINEER VARCHAR2(10), 
    PRIMARY KEY (STAFF_LEVEL) ENABLE
   );

Однако, когда я вставляю следующие данные, это не работает, потому что 2 строки одинаковы

BEGIN
insert into staff_lvl values (1,'N','N','Y');
insert into staff_lvl values (3,'N','Y','Y');
insert into staff_lvl values (7,'Y','Y','Y');
insert into staff_lvl values (3,'N','Y','Y');
END;

Кто-нибудь знает, как это решить?

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Как вы говорите, это для универсального проекта, и вы должны иметь STAFF_LEVEL в качестве первичного ключа ...

Говорит ли он, что STAFF_LEVEL ЕДИНСТВЕННЫЙ столбец, который должен быть в ПЕРВИЧНОМ КЛЮЧЕ?

Вы можете создать составной ПК с помощью:

CREATE TABLE  STAFF_LVL
 (
  STAFF_LEVEL NUMBER(1,0),
  MANAGER VARCHAR2(10),
  OPERATOR VARCHAR2(10),
  ENGINEER VARCHAR2(10),
  PRIMARY KEY (STAFF_LEVEL, MANAGER, OPERATOR, ENGINEER) ENABLE
); 

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

Вы уполномочены колонны?

Не могли бы вы добавить сгенерированный столбец PK на основе последовательности?

Что-то вроде:

CREATE TABLE  STAFF_LVL
 (
  ID NUMBER,
  STAFF_LEVEL NUMBER(1,0),
  MANAGER VARCHAR2(10),
  OPERATOR VARCHAR2(10),
  ENGINEER VARCHAR2(10),
  PRIMARY KEY (ID, STAFF_LEVEL) ENABLE
); 

CREATE SEQUENCE id_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 1;

insert into staff_lvl values (id_seq.nextval, 1,'N','N','Y');
insert into staff_lvl values (id_seq.nextval, 3,'N','Y','Y');
insert into staff_lvl values (id_seq.nextval, 7,'Y','Y','Y');
insert into staff_lvl values (id_seq.nextval, 3,'N','Y','Y'); 

По сути, ПК ДОЛЖЕН быть уникальным.

Будучи дерзким, если вам поручены столбцы, данные (которые не уникальны) и столбец PK, вы можете создать таблицу, первичный ключ и просто отключить PK. Он удовлетворяет критериям вашего проекта (и ужасно использует БД), но допускает неуникальные данные, хотя "технически" все еще имеет PK в таблице (даже если он отключен) ...

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

Вы объявили STAFF_LEVEL в качестве первичного ключа. Это означает, что вы попросили базу данных убедиться, что все строки в таблице имеют уникальное значение для STAFF_LEVEL. Тем не менее, вы пытаетесь вставить две разные строки с одинаковым уровнем. Вот что мешает вам вставить его.

STAFF_LEVEL не похоже, что он должен быть уникальным или служить первичным ключом. Поэтому удалите первичный ключ, и вы сможете вставить строку.

(И в следующий раз, пожалуйста, предоставьте точное сообщение об ошибке.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...