Проблема отношений в SQL (столбец нельзя каскадировать) - PullRequest
1 голос
/ 09 июня 2011

У меня есть 3 таблицы (Пациент, Доктор, Назначения). У пациента есть первичный ключ (Patient_ID) и внешний ключ (Doctor_ID). У доктора есть первичный ключ (Doctor_ID). Назначения имеют первичный ключ (Appo_ID) и два внешних ключа (Patient_ID, Doctor_ID) здесь проблема, в диаграмме отношений два отношения (Patient.Patient_ID, App.Patient_ID & Doctor.Doctor_ID, Appo.Doctor_ID) не могут быть каскадными одновременно, если один является каскадным, другой показывает этосообщение об ошибке

- Unable to create relationship 'FK_Appointments_Doctor'.  
Introducing FOREIGN KEY constraint 'FK_Appointments_Doctor' on table 'Appointments' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

и это моя процедура обновления

ALTER PROCEDURE UpdateDoc
    @Doctor_ID INT,@Name NVARCHAR(50),@Salary MONEY,@Hire_Date DATETIME,@Dept_ID INT,@Old_ID int
AS

    Update Doctor
    Set 
        @Old_ID=Doctor_ID,
    Doctor_ID=@Doctor_ID,
    [Name] =@Name,
    Salary=@Salary,
    Hire_Date=@Hire_Date,
    Dept_ID=@Dept_ID
    Where Doctor_ID=@Old_ID
Return

Если есть какие-либо вопросы для более конкретной, задайте мне

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Это циклическая зависимость, зачем вам это каскадно? И почему вы обновляете Doctor_ID, строго говоря, вы никогда не должны обновлять (устанавливать) первичный ключ.

То, что вы фильтруете Where Doctor_ID=@Doctor_ID по тому же значению, которое вы обновляете Set Doctor_ID=@Doctor_ID, говорит мне, что вы не прошли через это.

0 голосов
/ 09 июня 2011

У вас логическая проблема.Если вы определяете связь между пациентом и врачом, вы не можете определить встречу, связанную с обоими.Выберите только один из них, и вы получите другой.

Попробуйте смоделировать базу данных, используя бизнес-логику примера из реального мира.Так у вас есть врачи и пациенты, хорошо?Если врачи посвящены пациенту, и один врач будет обслуживать всегда одного и того же пациента, чем вы создаете внешний ключ, относящийся к ним.Затем для назначений назначение связано с пациентом, и поскольку пациент автоматически связан с врачом, назначение требует только внешнего ключа пациента.

0 голосов
/ 09 июня 2011

Я не понимаю, почему вы обновляете Doctor_ID, поскольку оно есть в предложении WHERE:

   Update Doctor
    Set 
    Doctor_ID=@Doctor_ID,
    ....
    Where Doctor_ID=@Doctor_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...