создавать запись в дочерней таблице, только если внешний ключ из дочерней таблицы имеет значение, назначенное ему в родительской таблице - PullRequest
1 голос
/ 09 апреля 2020

У меня есть две таблицы:

create table employeetasks (
    employeeid int not null,
    projectid int not null,
    taskcode char(1),
    primary key (employee, projectid)
);

create table workinghoursperday (
    employeeid int not null,
    projectid int not null,
    date date not null,
    hours float,
    primary key (employeeid, projectid, date),
    foreign key (employeeid) references employeetasks(employeeid),
    foreign key (projectid) references employeetasks(projectid)
);

Во второй таблице (дочерняя таблица с именем workinghoursperday) я хочу указать, сколько часов каждый сотрудник работает каждый день в конкретном c проекте, но в Чтобы зарегистрировать часы, в течение которых сотрудник работал в данный день в этом проекте, для employeeid должен быть присвоен код задачи в родительской таблице (employeeetasks).

Например, в родительской таблице (employeeetasks) мы можем иметь две записи:

FIRST ENTRY:      employeeid | projectid | taskcode
                       1     |     1     |   'A'


SECOND ENTRY:     employeeid | projectid | taskcode
                       2     |     1     |   null

Допустим, я хочу создать эти две записи в дочерней таблице (workinghoursperday):

FIRST ENTRY:       employeeid | projectid |     date     | hours
                        1     |     1     | '2020-04-09' | 6.5


SECOND ENTRY:      employeeid | projectid |     date     | hours
                        2     |     1     | '2020-04-10' | 7.5

Я хочу, чтобы первая запись в дочерней таблице была успешной поскольку employeeid 1 имеет код задачи (в данном случае 'A'), назначенный ему в projectid 1, но вторая запись в дочерней таблице должна завершиться неудачей, так как employeeid 2 не имеет назначенного ему кода задачи (так как значение равно нулю) на проект 1.

Я понятия не имею, как это сделать. Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 09 апреля 2020

Начинается с предикатов существования, чтобы создать «целую» логическую историю (модель). Выберите соответствующие разделы, чтобы скорректировать свой пример.

-- Employee EMP exists.
--
employee {EMP}
      PK {EMP}

-- Project PRO exists.
--
project {PRO}
     PK {PRO}

-- Task TSK exists.
--
task {TSK}
  PK {TSK}
-- Project PRO contains task TSK.
--
project_task {PRO, TSK}
          PK {PRO, TSK}

FK1 {PRO} REFERENCES project {PRO}
FK2 {TSK} REFERENCES task    {TSK}
-- Employee EMP is allocated to project PRO.
--
employee_project {EMP, PRO}
              PK {EMP, PRO}

FK1 {EMP} REFERENCES employee {EMP}
FK2 {PRO} REFERENCES project  {PRO}
-- Employee EMP is assigned task TSK of project PRO.
--
employee_task {EMP, PRO, TSK}
           PK {EMP, PRO, TSK}

FK1 {EMP, PRO} REFERENCES employee_project {EMP, PRO}
FK2 {PRO, TSK} REFERENCES project_task     {PRO, TSK}

Отслеживание ежедневных часов по задаче проекта сотрудника.

-- On date DTE, employee EMP worked HRS hours
-- on task TSK of project PRO.
--
task_hours_day {EMP, PRO, TSK, DTE, HRS}
            PK {EMP, PRO, TSK, DTE}

           FK {EMP, PRO, TSK} REFERENCES
employee_task {EMP, PRO, TSK}

Для ежедневных часов проекта сотрудника, создать представление.

-- On date DTE, employee EMP worked HRS_PRO hours
-- on project PRO.
--
-- {EMP, PRO, DTE} -- logical KEY
--
CREATE VIEW project_hours_day
AS
SELECT EMP, PRO, DTE, sum(HRS) AS HRS_PRO
FROM task_hours_day
GROUP BY EMP, PRO, DTE ;

Примечание:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
...