2016-12-08 4 views
0

У меня были проблемы с этим на некоторое время, у меня разные роли персонала в разных таблицах, все они должны быть назначены в офис, но не для меня. найти ответ, любая помощь будет оценена по достоинству. Ниже приведен пример кода и ERD того, что им пытаются достичь4 PK's как FK's в 1 столбец в Oracle

CREATE TABLE office (         --7 
    office_id  Number(4)NOT NULL PRIMARY KEY, 
    address  address, 



CREATE TABLE office_staff (        --8 
     staff_id  Number(4)NOT NULL PRIMARY KEY, 
     office_id   Number(4), 
     manager    char(1), 
     CONSTRAINT manager_boolean CHECK (manager IN ('1','0'))); 

CREATE TABLE staff_role (
     staff_role_id NUMBER(4) PRIMARY KEY, 
     staff_id  tinyint references office_staff(staff_id), 
     unique(staff_role_id, staff_id), 
     role_name  varchar2(20)); 

CREATE TABLE manager (         --1 
     manager_id  Number(4)NOT NULL PRIMARY KEY, 
     staff_role_id as cast(1 as tinyint) persisted, 
    foreign key (manager_id, staff_id) references staff_role(staff_role_id, staff_id) 
     manager_firstname varchar2(20), 
     manager_lastname varchar2(20), 
     gender   varchar2(1), 
     date_of_birth  date, 
     telephone   varchar2(11)); 

CREATE TABLE senior_instructor (      --2 
     senior_instructor_id Number(4)NOT NULL, 
     staff_role_id as cast(2 as tinyint) persisted, 
    foreign key (senior_instructor_id, staff_id) references staff_role(staff_role_id, staff_id) 
     s_instructor_firstname varchar2(20), 
     s_instructor_lastname varchar2(20), 
     gender     varchar2(1), 
     date_of_birth   date, 
     telephone    varchar2(11)); 

CREATE TABLE office_admin (        --3 
     admin_id  Number(4)NOT NULL, 
     staff_role_id as cast(3 as tinyint) persisted, 
    foreign key (admin_id, staff_id) references staff_role(staff_role_id, staff_id) 
     admin_firstname varchar2(20), 
     admin_lastname varchar2(20), 
     gender   varchar2(1), 
     date_of_birth date, 
     telephone  varchar2(11)); 

CREATE TABLE instructor (        --6 
     instructor_id  Number(4)NOT NULL, 
     staff_role_id as cast(4 as tinyint) persisted, 
    foreign key (instructor_id, staff_id) references staff_role(staff_role_id, staff_id) 
     instructor_firstname varchar2(20), 
     instructor_lastname varchar2(20), 
     gender    varchar2(1), 
     date_of_birth  date, 
     telephone   varchar2(11), 
     car_id    Number(4)); 

Выходной ток чтения Datatype не поддерживается

ERD link here

+0

Я не уверен, что выше, но точно это не так. Oracle SQL. Итак, какие RDBMS вы используете? – arturro

+0

Я использую Oracle 10g –

+0

Итак, это не синтаксис Oracle. В Oracle нет tinyint (имеется в MS SqlServer), это: staff_role_id как cast (1 as tinyint) сохраняется, не является правильным синтаксисом для oracle, unique (staff_role_id, staff_id) также неверен - в oracle это должно быть: CONSTRAINT constraint_name UNIQUE (uc_col1, uc_col2, ... uc_col_n). Вам нужно многое исправить. – arturro

ответ

0

Я исправил некоторые ошибки синтаксиса и изменил некоторые из имен столбцов ,

Этот код дает вам то, что вам нужно?

CREATE TABLE office (         
    office_id  Number(4) NOT NULL PRIMARY KEY, 
    address  VARCHAR2(200)); 

CREATE TABLE office_staff (        
     staff_id  Number(4)NOT NULL PRIMARY KEY, 
     office_id   Number(4), 
     manager    char(1), 
     CONSTRAINT manager_boolean CHECK (manager IN ('1','0'))); 

CREATE TABLE staff_role (
     staff_role_id NUMBER(4) PRIMARY KEY, 
     staff_id  Number(4) references office_staff(staff_id), 
     unique(staff_role_id, staff_id), 
     role_name  varchar2(20)); 

CREATE TABLE manager (         
     manager_id  Number(4)NOT NULL PRIMARY KEY, 
     staff_role_id NUMBER(1), 
    foreign key (staff_role_id, manager_id) references staff_role(staff_role_id, staff_id), 
     manager_firstname varchar2(20), 
     manager_lastname varchar2(20), 
     gender   varchar2(1), 
     date_of_birth  date, 
     telephone   varchar2(11)); 

CREATE TABLE senior_instructor (       
     senior_instructor_id Number(4)NOT NULL, 
     staff_role_id NUMBER(1), 
    foreign key (staff_role_id, senior_instructor_id) references staff_role(staff_role_id, staff_id), 
     s_instructor_firstname varchar2(20), 
     s_instructor_lastname varchar2(20), 
     gender     varchar2(1), 
     date_of_birth   date, 
     telephone    varchar2(11)); 

CREATE TABLE office_admin (        
     admin_id  Number(4)NOT NULL, 
     staff_role_id NUMBER(1), 
    foreign key (staff_role_id, admin_id) references staff_role(staff_role_id, staff_id), 
     admin_firstname varchar2(20), 
     admin_lastname varchar2(20), 
     gender   varchar2(1), 
     date_of_birth date, 
     telephone  varchar2(11)); 

CREATE TABLE instructor (        
     instructor_id  Number(4)NOT NULL, 
     staff_role_id NUMBER(1), 
    foreign key (staff_role_id, instructor_id) references staff_role(staff_role_id, staff_id), 
     instructor_firstname varchar2(20), 
     instructor_lastname varchar2(20), 
     gender    varchar2(1), 
     date_of_birth  date, 
     telephone   varchar2(11), 
     car_id    Number(4)); 

Есть ли причина, по которой вы используете 4 стола для разных типов персонала? Если вы не обязаны это делать, я бы рекомендовал объединить их в одну таблицу (возможно, это то, что вы пытаетесь сделать с office_staff), и иметь отношение к таблице staff_roles.

+0

Спасибо, разные роли персонала имеют разные отношения с другой таблицей, поэтому они хотели, чтобы они были разделены для упрощения ссылки –