【发布时间】:2021-02-20 19:35:50
【问题描述】:
这是使用 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,
phys_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 行
无法创建约束或索引。查看以前的错误。
我是否遗漏了一些明显的东西?我刚开始使用这个程序,所以非常感谢任何帮助。
【问题讨论】:
-
FK 必须引用整个密钥,即此处的两个 PK 列 digi_id、phys_id。
-
我不确定我明白你的意思
-
让每个人的生活更轻松。 “CONTNS”这个名字是什么意思?对我来说没什么。为什么需要缩写、浓缩或混淆名称本身?通过删除一些元音和字母,你究竟节省了什么?更重要的是,我认为您的架构在逻辑上存在缺陷,这是您斗争的一部分。您似乎尝试在书籍和 2 个子类型表之间实现
关系,但感到困惑并迷失了方向。 -
而且我建议您可能有许多非常不同类型的“事务”,可能更好地单独实施。目前,您刚刚开始为“借”交易建模,但您选择使用非常通用的名称。这是一种过早优化的形式,可能会导致您的困惑。
-
我建议你先创建表,然后是主键,然后是外键。它会让事情变得更清楚。此外,始终命名 PRIMARY KEY、FOREIGN KEY。不要使用系统生成的名称
标签: sql sql-server database-design foreign-keys ssms