【问题标题】:Trying to create a linking table [closed]试图创建一个链接表[关闭]
【发布时间】:2022-01-22 09:16:15
【问题描述】:
CREATE TABLE patient 
(
    patientid INT NOT NULL,
    patientname VARCHAR(100),
    patientphone VARCHAR(100),

    CONSTRAINT PK_patient PRIMARY KEY (patientid)
)

CREATE TABLE doctor 
(
    doctorid INT NOT NULL,
    doctorname VARCHAR(100),

    CONSTRAINT PK_doctor PRIMARY KEY (doctorid)
)

CREATE TABLE drug 
(
    drugname VARCHAR(100),
    drugid INT NOT NULL,

    CONSTRAINT PK_drug PRIMARY KEY (drugid)
)

CREATE TABLE visit  
(
    visitid INT NOT NULL,
    visitdate DATE,
    visitreason VARCHAR(200),
    doctorid INT REFERENCES doctor (doctorid),
    patientid INT REFERENCES patient (patientid),
    PRIMARY KEY (visitid, doctorid, patientid)
)

CREATE TABLE druglinkingtable 
(
    drugid INT REFERENCES drug (drugid),
    visitid INT REFERENCES visit (visitid),
    PRIMARY KEY (drugid, visitid)
)

druglinkingtable 中出现错误:

引用表“visit”中没有与外键“FK__druglinki__visit__44FF419A”中的引用列列表匹配的主键或候选键

【问题讨论】:

  • 错误不明白怎么办?您已经为VisitPRIMARY KEY(visitid,doctorid,patientid) 定义了一个 3 部分 PK,并尝试使用 1 部分 FK visitid INT REFERENCES visit(visitid), 来引用它。我看不出有任何理由在 Visit 上进行 3 部分 PK。
  • 您可能只想将visitid 作为visit 的主键?或者该专栏的其他目的是什么?

标签: sql sql-server tsql foreign-keys primary-key


【解决方案1】:

任何引用访问的外键都必须以唯一索引为目标。您可以使用您拥有的复合 PK,或者将 visitid 设置为 PK。

CREATE TABLE visit  
(
    visitid INT NOT NULL,
    visitdate DATE,
    visitreason VARCHAR(200),
    doctorid INT REFERENCES doctor (doctorid),
    patientid INT REFERENCES patient (patientid),
    CONSTRAINT pk_visit PRIMARY KEY (visitid),
    INDEX ix_doctorid (doctorId),
    INDEX ix_patientid (patientid)
)

另外一个合理的参观设计是:

CREATE TABLE visit  
(
    visitid INT NOT NULL,
    visitdate DATE,
    visitreason VARCHAR(200),
    doctorid INT REFERENCES doctor (doctorid),
    patientid INT REFERENCES patient (patientid),
    CONSTRAINT pk_visit PRIMARY KEY (patientid,doctorid,visitid),
    INDEX ix_doctorid (doctorId)    
)

然后

CREATE TABLE druglinkingtable 
(
    patientid int,
    doctorid int 
    visitid INT REFERENCES visit (patientid,doctorid,visitid),
    drugid INT REFERENCES drug (drugid),
    PRIMARY KEY (patientid,doctorid,visitid,drugid),
    INDEX ix_drugid (drugid)
)

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多