问题描述
这是使用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_id
和phys_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)
);