【问题标题】:Problems referencing primary key with foreign key用外键引用主键的问题
【发布时间】: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_idphys_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


【解决方案1】:

这里:

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 创建两个外键。但该表有一个复合主键(即多列主键)

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

因此,您需要一个复合外键:

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

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2011-01-29
    相关资源
    最近更新 更多