Составной внешний ключ - возможно в Oracle? - PullRequest
1 голос
/ 08 декабря 2011

Я пытаюсь создать в 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:

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

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

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)
)
4 голосов
/ 08 декабря 2011

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

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))
2 голосов
/ 08 декабря 2011

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

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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...