2012-11-15 143 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中已經有重複的醫師姓名,則可能會有數據清理問題。