Ошибка ограничения целостности снова

Я создаю четыре таблицы базы данных по следующим схемам, но получаю ошибку нарушения ограничения целостности. Вот моя вся схема вместе с запросами для заполнения таблиц:

create table Employee(
    Lastname    varchar(10),
    FirstName   varchar(10),
    MidInitial  char(1),
    gender      char(1),
    street      varchar(10),
    city        varchar(10),
    primary key(Lastname, FirstName, MidInitial));

create table company(
    company_name    varchar(20),
    city    varchar(10),
    primary key(company_name));

create table Works(
    Lastname    varchar(10),
    FirstName   varchar(10),
    MidInitial  char(1),
    company_name    varchar(20),
    salary      numeric(8,2),
    primary key(Lastname, FirstName, MidInitial, company_name),
    foreign key(Lastname, FirstName, MidInitial) references Employee,
    foreign key(company_name) references company);

create table Manages(
    Lastname    varchar(10),
    FirstName   varchar(10),
    MidInitial  char(1),
    ManagerLastname varchar(10),
    MFirstName  varchar(10),
    MMidInitial char(1),
    start_date  date,
    primary key(Lastname, FirstName, MidInitial, ManagerLastname, MFirstName, MMidInitial),
    foreign key(Lastname, FirstName, MidInitial) references Employee);

insert into Employee
    values('Anderson', 'Susan', 'L', 'F', '108th', 'Omaha');
insert into Employee
    values('Brandy', 'Dan', 'L', 'M', 'P street', 'Lincoln');
insert into Employee
    values('Chen', 'Peter', 'K', 'M', '124th', 'Omaha');
insert into Employee
    values('Clemson', 'Ann', 'M', 'F', 'O', 'Lincoln');
insert into Employee
    values('Dale', 'Mary', 'K', 'F', '132nd', 'Omaha');
insert into Employee
    values('Gill', 'Mary', 'L', 'F', 'P street', 'Lincoln');
insert into Employee
    values('Harrison', 'Susan', 'M', 'F', 'Old Mill', 'Omaha');
insert into Employee
    values('Jackson', 'Kim', 'A', 'F', '178th', 'Omaha');
insert into Employee
    values('Jason', 'Pat', 'M', 'M', '8th', 'C. Bluffs');
insert into Employee
    values('Kumar', 'Paul', 'T', 'M', 'Dodge', 'Omaha');
insert into Employee
    values('Orr', 'Susanne', 'S', 'F', 'Q', 'Omaha');
insert into Employee
    values('Peterson', 'Mike', 'E', 'M', 'Blondo', 'Omaha');
insert into Employee
    values('Powell', 'Tom', 'E', 'M', 'Broadway', 'C. Bluffs');
insert into Employee
    values('Quinn', 'Jacky', 'M', 'F', '168th', 'Omaha');
insert into Employee
    values('Rand', 'Pam', 'R', 'F', '13th', 'Omaha');
insert into Employee
    values('Schreck', 'Ann', 'P', 'F', '214th', 'Elkhorn');
insert into Employee
    values('Simon', 'Eric', 'K', 'M', '77th', 'Lincoln');
insert into Employee
    values('Smith', 'John', 'A', 'M', '8th', 'C. Bluffs');
insert into Employee
    values('Thomson', 'Ron', 'F', 'M', 'Farnam', 'Omaha');
insert into Employee
    values('Young', 'Don', 'R', 'M', 'Dodge', 'Omaha');
insert into Employee
    values('Wong', 'Carole', 'S', 'F', 'Broadway', 'C. Bluffs');

insert into company
    values('First Bank', 'Omaha');
insert into company
    values('FDR', 'Omaha');
insert into company
    values('Lincoln Star', 'Lincoln');
insert into company
    values('Mutual of Omaha', 'Omaha');
insert into company
    values('Union Pacific (UP)', 'Omaha');

insert into Works
    values('Anderson', 'Susan', 'L', 'Mutual of Omaha', 48000);
insert into Works
    values('Brandy', 'Dan', 'L', 'FDR', 42000);
insert into Works
    values('Chen', 'Peter', 'K', 'FDR', 53000);
insert into Works
    values('Clemson', 'Ann', 'M', 'First Bank', 39000);
insert into Works
    values('Dale', 'Mary', 'K', 'Mutual of Omaha', 58000);
insert into Works
    values('Gill', 'Mary', 'L', 'Union Pacific', 48700);
insert into Works
    values('Harrison', 'Susan', 'M', 'Union Pacific', 54320);
insert into Works
    values('Jackson', 'Kim', 'A', 'FDR', 68000);
insert into Works
    values('Jason', 'Pat', 'M', 'FDR', 83000);
insert into Works
    values('Kumar', 'Paul', 'T', 'FDR', 44000);
insert into Works
    values('Orr', 'Susanne', 'S', 'Lincoln Star', 32000);
insert into Works
    values('Peterson', 'Mike', 'E', 'First Bank', 37000);
insert into Works
    values('Powell', 'Tom', 'E', 'First Bank', 54000);
insert into Works
    values('Quinn', 'Jacky', 'M', 'First Bank', 85000);
insert into Works
    values('Rand', 'Pam', 'R', 'FDR', 37000);
insert into Works
    values('Schreck', 'Ann', 'P', 'First Bank', 36000);
insert into Works
    values('Simon', 'Eric', 'K', 'Mutual of Omaha', 45000);
insert into Works
    values('Smith', 'John', 'A', 'FDR', 55000);
insert into Works
    values('Thomson', 'Ron', 'F', 'First Bank', 39000);
insert into Works
    values('Young', 'Don', 'R', 'Mutual of Omaha', 27000);
insert into Works
    values('Wong', 'Carole', 'S', 'First Bank', 44000);

insert into Manages
    values('Anderson', 'Susan', 'L', 'Dale', 'Mary', 'K', "15-SEP-2002");
insert into Manages
    values('Brandy', 'Dan', 'L', 'Jason', 'Pat', 'M', "05-MAR-2004");
insert into Manages
    values('Chen', 'Peter', 'K', 'Jason', 'Pat', 'M', "12-JUNE-2002");
insert into Manages
    values('Clemson', 'Ann', 'M', 'Powell', 'Tom', 'E', "30-AUG-2001");
insert into Manages
    values('Gill', 'Mary', 'L', 'Harrison', 'Susan', 'M', "25-JAN-2003");
insert into Manages
    values('Jackson', 'Kim', 'A', 'Jason', 'Pat', 'M', "09-MAY-2008");
insert into Manages
    values('Kumar', 'Paul', 'T', 'Jason', 'Pat', 'M', "09-MAY-2001");
insert into Manages
    values('Rand', 'Pam', 'R', 'Smith', 'John', 'A', "15-JAN-2004");
insert into Manages
    values('Peterson', 'Mike', 'E', 'Powell', 'Tom', 'E', "30-AUG-2006");
insert into Manages
    values('Schreck', 'Ann', 'P', 'Quinn', 'Jacky', 'M', "28-FEB-1996");
insert into Manages
    values('Simon', 'Eric', 'K', 'Anderson', 'Susan', 'L', "22-FEB-2004");
insert into Manages
    values('Smith', 'John', 'A', 'Jason', 'Pat', 'M', "05-MAR-2003");
insert into Manages
    values('Thomson', 'Ron', 'F', 'Powell', 'Tom', 'E', "30-AUG-1998");
insert into Manages
    values('Wong', 'Carole', 'S', 'Quinn', 'Jacky', 'M', "28-FEB-2001");
insert into Manages
    values('Young', 'Don', 'R', 'Dale', 'Mary', 'K', "15-SEP-2007");

И вот ошибка, которую я получаю снова:

Schema Creation Failed: ORA-02291: integrity constraint (USER_4_3C8F2.SYS_C00778260) violated - parent key not found

Было бы здорово получить еще одну пару глаз, чтобы взглянуть на это и посмотреть, что с этим происходит... Мне интересно, должен ли я создавать/заполнять таблицы в другом порядке, но я подумал, что то, что я был делал правильно.

Любая помощь приветствуется. Спасибо!

----ОБНОВЛЕНИЕ---- Также я использую SQL Fiddle и Oracle 11g R2.


person user1462294    schedule 18.09.2013    source источник
comment
Похоже, вы пытаетесь вставить значение в дочернюю таблицу, но этого значения нет в родительской таблице. Попробуйте еще раз проверить набор данных.   -  person Chamal Pradeep Rajapakse    schedule 18.09.2013


Ответы (3)


Ok. Замечено несколько ошибок...

insert into Works 
    values('Gill', 'Mary', 'L', 'Union Pacific (UP)', 48700);
insert into Works
    values('Harrison', 'Susan', 'M', 'Union Pacific (UP)', 54320);

-- Изменено «Union Pacific» на «Union Pacific (UP)».

insert into Manages
    values('Anderson', 'Susan', 'L', 'Dale', 'Mary', 'K', '15-SEP-2002');
insert into Manages
    values('Brandy', 'Dan', 'L', 'Jason', 'Pat', 'M', '05-MAR-2004');
insert into Manages
    values('Chen', 'Peter', 'K', 'Jason', 'Pat', 'M', '12-JUNE-2002');
insert into Manages
    values('Clemson', 'Ann', 'M', 'Powell', 'Tom', 'E', '30-AUG-2001');
insert into Manages
    values('Gill', 'Mary', 'L', 'Harrison', 'Susan', 'M', '25-JAN-2003');
insert into Manages
    values('Jackson', 'Kim', 'A', 'Jason', 'Pat', 'M', '09-MAY-2008');
insert into Manages
    values('Kumar', 'Paul', 'T', 'Jason', 'Pat', 'M', '09-MAY-2001');
insert into Manages
    values('Rand', 'Pam', 'R', 'Smith', 'John', 'A', '15-JAN-2004');
insert into Manages
    values('Peterson', 'Mike', 'E', 'Powell', 'Tom', 'E', '30-AUG-2006');
insert into Manages
    values('Schreck', 'Ann', 'P', 'Quinn', 'Jacky', 'M', '28-FEB-1996');
insert into Manages
    values('Simon', 'Eric', 'K', 'Anderson', 'Susan', 'L', '22-FEB-2004');
insert into Manages
    values('Smith', 'John', 'A', 'Jason', 'Pat', 'M', '05-MAR-2003');
insert into Manages
    values('Thomson', 'Ron', 'F', 'Powell', 'Tom', 'E', '30-AUG-1998');
insert into Manages
    values('Wong', 'Carole', 'S', 'Quinn', 'Jacky', 'M', '28-FEB-2001');
insert into Manages
    values('Young', 'Don', 'R', 'Dale', 'Mary', 'K', '15-SEP-2007');

-- Все двойные кавычки заменены на одинарные.

person SriniV    schedule 18.09.2013

Это ваша проблема:

insert into Works values('Gill', 'Mary', 'L', 'Union Pacific', 48700);

«Юнион Пасифик» не входит в число ваших компаний, у вас есть «Юнион Пасифик (УП)».

Кроме того, это действительно потрепанный способ сделать это в любом случае. Дублирование ваших данных в таблицах, подобных этой, будет означать, что у вас будут возникать подобные проблемы снова и снова.

У вас действительно должен быть суррогатный ключ для каждой из ваших таблиц справочных данных (Employee и Company), и ваши подробные таблицы (Works и Manages) должны использовать их. Например:

create table Employee(
    Id          numeric(8),
    Lastname    varchar(10),
    FirstName   varchar(10),
    MidInitial  char(1),
    gender      char(1),
    street      varchar(10),
    city        varchar(10),
    primary key(Id));

create table company(
    Id           numeric(8),
    company_name varchar(20),
    city         varchar(10),
    primary key(Id));

create table Works(
    Employee_Id numeric(8),
    Company_Id  numeric(8),
    salary      numeric(8,2),
    primary key(Employee_Id, Company_Id),
    foreign key(Employee_Id) references Employee(Id),
    foreign key(Company_Id) references Company(Id);

create table Manages(
    Employee_Id,
    Manager_Id,
    start_date  date,
    primary key(Employee_Id,Manager_id),
    foreign key(Employee_Id) references Employee(Id),
    foreign key(Manager_Id) references Employee(Id));
person StevieG    schedule 18.09.2013
comment
Спасибо и спасибо за лучший способ написать это ... Я исправил ошибку UP, но теперь я получаю эту ошибку при попытке построить схему: Ошибка создания схемы: ORA-00984: столбец не разрешен здесь Любые идеи по этому поводу один? Спасибо еще раз. - person user1462294; 18.09.2013
comment
Обратитесь к моему сообщению... Все ваши утверждения вылечены @user1462294 - person SriniV; 18.09.2013
comment
с вашей исходной схемой? - person StevieG; 18.09.2013
comment
Двойные кавычки должны быть одинарными, согласно @realspirituals. - person StevieG; 18.09.2013
comment
@David - хорошо сказано, я немного торопился и забыл это сделать .. Отредактировал пост. Однако HAven не добавил никаких уникальных ограничений, оставив это на усмотрение OP, если он / она решит изменить свой дизайн. - person StevieG; 18.09.2013

foreign key(Lastname, FirstName, MidInitial) references Employee**(column)**

Вы забыли столбец «Сотрудник».

person Mihai    schedule 18.09.2013