2011-12-08 2 views
1

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

CREATE TABLE employee_licence_certificate(
    emp_id NUMBER(4) REFERENCES employee(emp_id) 
    , licence_cert_code VARCHAR2(6) REFERENCES licence_certificate(licence_cert_code) 
    , date_earned DATE NOT NULL 
    ) 
PRIMARY KEY (emp_id, licence_cert_code)) 

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

Error starting at line 1 in command: 
CREATE TABLE employee_licence_certificate(emp_id NUMBER(4) REFERENCES employee(emp_id) 
, licence_cert_code VARCHAR2(6) REFERENCES licence_certificate(licence_cert_code) 
, date_earned DATE NOT NULL) PRIMARY KEY (emp_id, licence_cert_code)) 
Error at Command Line:3 Column:29 
Error report: 
SQL Error: ORA-00922: missing or invalid option 
00922. 00000 - "missing or invalid option" 
*Cause:  
*Action: 
+0

возможно дубликат [SQL Error: ORA-00922: отсутствует или ошибочного выбора, создающей составной ключ] (http://stackoverflow.com/questions/8426047/sql-error -ora-00922-missing-or-invalid-option-create-composite-key) –

+0

да, простите, я забыл, что просил вчера вечером/утром, что я всю ночь работал и забыл об этом. Прости меня. @JustinCave –

ответ

4

Попробуйте это:

CREATE TABLE employee_licence_certificate(
    emp_id NUMBER(4) REFERENCES employee(emp_id) 
    , licence_cert_code VARCHAR2(6) REFERENCES licence_certificate(licence_cert_code) 
    , date_earned DATE NOT NULL 
    , 
PRIMARY KEY (emp_id, licence_cert_code)) 
+0

Да, что сработало, но я клянусь, что это точно так же, как и мой, я думаю, что я что-то не замечаю, пожалуйста, не могли бы вы указать на это, поэтому я не буду делать ту же ошибку в будущем и спасибо! @chance –

+0

Нет, у вас неправильные скобки в скобках и пропущена запятая. – chance

+0

Вы ошиблись, если бы у вас была закрывающая скобка ')' между столбцом даты и первичным ключом, но @chance использует запятую ',', поэтому она работает. – Sodved

2

Это точно возможно. Вам просто нужно исправить заявление:

CREATE TABLE employee_licence_certificate(emp_id NUMBER(4) REFERENCES employee(emp_id) 
, licence_cert_code VARCHAR2(6) REFERENCES licence_certificate(licence_cert_code) 
, date_earned DATE NOT NULL, PRIMARY KEY (emp_id, licence_cert_code)) 

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

create table employee_licence_certificate 
(
    emp_id number(15) references employee(emp_id), 
    licence_cert_code VARCHAR2(6) REFERENCES licence_certificate(licence_cert_code), 
    date_earned date not null, 
    primary key (emp_id, licence_cert_code) 
) 
4

Я использую другой синтаксис. Я предпочитаю явно указывать ограничения внешнего ключа, чтобы сообщение об ошибке, если/когда его нарушение было более значимым/tracable. Так что я хотел бы сделать это что-то вроде этого:

CREATE TABLE employee_licence_certificate 
( emp_id    NUMBER(4) NOT NULL 
, licence_cert_code VARCHAR2(6) NOT NULL 
, date_earned   DATE  NOT NULL 
, CONSTRAINT elc_pk PRIMARY KEY (emp_id, licence_cert_code) 
, CONSTRAINT elc_emp_fk FOREIGN KEY (emp_id) 
     REFERENCES employee(emp_id) 
, CONSTRAINT elc_lct_fk FOREIGN KEY (licence_cert_code) 
     REFERENCES licence_certificate(licence_cert_code) 
) 
+1

Черт тебя, я просто пытался опубликовать тот же ответ :) – jFrenetic

Смежные вопросы