微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用外键引用主键时出现问题

如何解决用外键引用主键时出现问题

这是使用Microsoft sql Server Management Studio创建图书库数据库开头的代码

CREATE DATABASE BOOK_LIBRARY

CREATE TABLE LIBRARY_USER
(
    usr_id int not null primary key,f_name varchar(30) not null,m_init char(1),l_name varchar(30) not null,balance decimal(6,2),join_date date,addRSS_1 varchar(30) not null,addRSS_2 varchar(30),city varchar(30) not null,addRSS_state char(2) not null,zip_code varchar(10) not null,email varchar(30)
);

CREATE TABLE LIBRARY_TRANSACTIONS
(
    transaction_id int not null primary key,maximum_borrow_duration int not null,strt_date date not null,actual_return_date date not null,borrow_usr_id int not null,foreign key (borrow_usr_id) references LIBRARY_USER(usr_id)
);

CREATE TABLE BOOKS
(
    isbn varchar(17) not null primary key,title varchar(30) not null,number_of_copies int not null,Author varchar(30) not null,Number_of_pages int not null,publish_year int not null,book_type varchar(20)
);

CREATE TABLE DIGITAL_BOOKS
(
    digital_id int not null primary key,format varchar(30) not null,size_mb int not null,digital_isbn varchar(17) not null,foreign key(digital_isbn) references BOOKS(isbn)
);

CREATE TABLE PHYSICAL_BOOKS
(
    physical_id int not null primary key,condition varchar(20) not null,physical_isbn varchar(17) not null,foreign key(physical_isbn) references BOOKS(isbn)
);

CREATE TABLE BOOK_copY
(
    digi_id int not null,phys_id int not null,primary key(digi_id,phys_id),foreign key(digi_id) references DIGITAL_BOOKS(digital_id),foreign key(phys_id) references PHYSICAL_BOOKS(physical_id)
);

CREATE TABLE CONTNS
(
    trans_id int not null primary key,digi_id int not null,foreign key(digi_id) references BOOK_copY(digi_id),foreign key(phys_id) references BOOK_copY(phys_id)
);

尽管我能够看到digi_idphys_id实际上是book_copy表的主键,但我仍然收到此错误

1776消息,级别16,状态0,第66行
在引用表'BOOK_copY'中没有与外键'FK__CONTNS__digi_id__37A5467C'中的引用列列表匹配的主键或候选键。

1750消息,第16级,状态1,第66行
无法创建约束或索引。查看先前的错误

我缺少明显的东西吗?我只是开始使用该程序,因此,非常感谢您的帮助。

解决方法

这里:

CREATE TABLE CONTNS
(
    trans_id int not null primary key,digi_id int not null,phys_id int not null,foreign key(digi_id) references BOOK_COPY(digi_id),foreign key(phys_id) references BOOK_COPY(phys_id)
);

您正在创建指向父表BOOK_COPY的两个外键。但是该表具有 compound 主键(即多列主键)

CREATE TABLE BOOK_COPY
(
    digi_id int not null,primary key(digi_id,phys_id),--> here
    ...
)

因此,您需要一个 compound 外键:

CREATE TABLE CONTNS
(
    trans_id int not null primary key,foreign key(digi_id,phys_id) references BOOK_COPY(digi_id,phys_id)
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。