我正在尝试基于我从非数据库系统导入的平面文件创建一个小型数据库。导入正在运行,数据库很好,但我添加了一个包含来自另一个系统的数据的新表。我试图在表之间创建一个关系,但因为一个表有重复的行(平面文件是源)我无法设置该关系。 示例:表1列出了医生为患者完成的所有程序。患者可以在同一天由同一位医生进行许多相同的程序(因此重复行)......表2列出了医生和他们的ID #s ...我想根据医生的名字建立两个表之间的关系,但由于非唯一数据我得到错误。 有人有小费吗? 谢谢
答案 0 :(得分:0)
患者可以在同一天由同一位医生进行许多相同的手术(因此重复行)
通常,即使存在重复行,您也应该能够设置从Table1到Table2的外键关系。这种错误通常是意味着您正在尝试将外键设置在错误的表中。
-- Your "Table2"
create table physicians (
physician_id integer primary key,
physician_name varchar(35) not null -- names are not unique
);
insert into physicians values
(1, 'Doctor Who'), (2, 'Dr. Watson');
create table patients (
patient_id integer primary key,
patient_name varchar(35) not null -- names are not unique
);
insert into patients values
(100, 'Melville, Herman'), (101, 'Poe, Edgar Allen');
-- Your "Table1"
-- Allows multiple physicians per date.
create table patient_procedures(
patient_id integer not null references patients (patient_id),
physician_id integer not null references physicians(physician_id),
procedure_date date not null default current_date,
procedure_name varchar(15) not null,
primary key (patient_id, physician_id, procedure_date, procedure_name)
);
insert into patient_procedures values
(100, 1, '2012-01-02', 'CBC'),
(100, 1, '2012-01-02', 'Thyroid panel');
答案 1 :(得分:0)
我不确定您的描述中重复数据问题的位置。你有:
有意义的关系是1 [表2医生行] - >很多[表1程序行]。即,表2将是关系中的主键表:每个表2行与0和“多”表1行之间有关。如果您尝试创建这种关系,那么多个重复的表1行不是问题。
但是,如果表2中每位医生有多行,那么您将无法创建这种关系,因为表2行不是唯一的,因此不能作为主键元素关系。然后问题是数据清理之一:弄清楚表2中的哪些行是重复的,将表1行更新为指向重复的一位医生,然后从表2中删除重复的行。
您提到了医生ID和医生姓名。对于唯一的密钥,医生名称将是一个糟糕的选择;如果用户在已经有另一名医生的情况下尝试添加一名名为“John Smith”的新医生,
应使用医生ID设置关系。如果表1(程序)包括医生ID列,那么您很幸运。如果它只包括医生姓名,那么如果表2中已有重复的医生姓名,则可能存在数据清理问题。