2012-11-15 246 views
1

我正在尝试基于从非数据库系统导入的平面文件创建小型数据库。导入工作,数据库是好的,但我添加了一个新的表,其中包含来自另一个系统的数据。我试图创建表之间的关系,但因为一个表有重复的行(平面文件是源),我无法设置该关系。 示例:表1列出了由医生为患者完成的所有程序。患者可以在同一天由相同的医生进行许多相同的程序(因此是重复的行)...表2列出了医生列表和他们的ID号......我想根据医师的名字建立两张表之间的关系,但由于非唯一的数据,我收到了错误。 任何人有小费? 感谢SQL数据库表关系

回答

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'); 
0

我不知道从您的描述重复数据问题。您有:

  • 表1:程序。可能是同一医生的很多行
  • 表2:医生。应该是每个医生1行(但可能有重复)

有意义的关系将是1 [表2医师行] - >许多[表1程序行]。即表2将成为关系中的主键表:每个表2行涉及0与“许多”表1行之间的关系。如果您尝试创建这种关系,那么多个重复的表格1行不成问题。

但是,如果你在表2每位医生多行,那么你将无法建立这种关系,因为表2行是不是唯一的,因此不能作为主键元素在关系中。然后问题是数据清理之一:确定表2中的哪些行是重复的,将表1行更新为仅指向一位医师,然后删除表2中的重复行。

你提到医师ID和医生的名字。医生的名字对于一个独特的钥匙来说是一个不好的选择;如果用户试图添加一个名为“约翰·史密斯”新医生时,已经有该名称的其他医生,要么

  1. 你已经设置了对PhysicianName唯一索引,其变动被拒绝,你有愤怒的用户;或
  2. 你还没有,并且所有现有的医生(我们称他为John A. Smith)的程序将与其他医生(我们称他为John B. Smith)相关联,反之亦然。

该关系应该使用医师ID进行设置。如果表1(程序)包含医师ID列,那么您很幸运。如果它只包含医生姓名,那么如果表2中已经有重复的医师姓名,则可能会有数据清理问题。