У меня есть отношения, в которых медик — это человек, а у медика есть 3 атрибута: ID, paycheck и speciality, а у человека есть name ,age,gender,address, и поскольку медик - это person, я хочу, чтобы

Таким образом, когда медик создается с указанным ID, он получит info( name,age etc ) от person с этим id.

Есть ли способ сделать это без использования update, но вместо этого сделать это при создании таблицы, например сказать, что table Medic имеет атрибуты Name where Medic.name = Person.Name, если person.id = medic.id.

0
João Folgado 12 Ноя 2019 в 14:56
4
Не копируйте данные из одной таблицы в другую. Держите его там, где он есть. При необходимости создайте представление.
 – 
jarlh
12 Ноя 2019 в 14:57
Нет - у человека нет "возраста". У человека есть дата рождения, из которой можно определить возраст, когда это необходимо и для определенного момента времени.
 – 
SMor
12 Ноя 2019 в 15:35
Это проблема нормализации, и 3-я нормальная форма, скорее всего, решит вашу проблему. Я бы порекомендовал прочитать о нормальных формах (до третьей обычно достаточно) для реляционных баз данных. В крайнем случае, вы не хотите хранить избыточные данные в своей базе данных, это создаст проблемы с согласованностью. en.wikipedia.org/wiki/Database_normalization
 – 
EzLo
12 Ноя 2019 в 15:42

1 ответ

Вы должны определить medics, используя ссылку внешнего ключа:

create table medics (
    medic_id int identity(1, 1) primary key,
    payment ?,  -- whatever the type is
    specialty nvarchar(255),
    person_id int,
    foreign key (person_id) references persons(person_id)
);

create tabel persons (
    person_id int identity(1, 1) primary key,
    name nvarchar(255),  -- or whatever
    . . .   -- and so on
);

Затем для insert:

insert into medics (payment, specialty, person_id)
    select @payment, @specialty, p.person_id
    from persons p
    where p.name = @name;
0
Gordon Linoff 12 Ноя 2019 в 14:59
Я хотел сделать так, чтобы мне не нужно было делать эту вставку, но если бы я сделал вставку, она автоматически взяла бы информацию от человека с идентификатором в медике
 – 
João Folgado
12 Ноя 2019 в 15:08
Сбор информации должен выполняться во время выполнения путем присоединения к запросу, а не путем копирования данных.
 – 
underscore_d
12 Ноя 2019 в 15:36
. . . Вы можете сделать это с помощью представления и триггера insert в представлении.
 – 
Gordon Linoff
12 Ноя 2019 в 22:17