Sql 外键和参考键之间有什么区别?

Sql 外键和参考键之间有什么区别?,sql,database,foreign-keys,Sql,Database,Foreign Keys,我对这两个术语感到非常困惑。它们是相同的还是不同的 一些书和人说他们是一样的,而另一些人说他们是不同的 我试过了,但没有找到一个结论性的答案。“引用键”在关系建模或美国英语的SQL实现中不是一个普通的技术术语 外键“引用”某个其他表中的键;这可能是混淆的原因吗?你并不是真的把某个东西叫做参考键。。。他们是一样的。。。您可能会看到在sqlite中使用的单词references:您可以使用这样的语法来创建一个作者和书籍数据库。这可以让你展示一个作者可以有很多书。这告诉dbbooks.author\u

我对这两个术语感到非常困惑。它们是相同的还是不同的

一些书和人说他们是一样的,而另一些人说他们是不同的

我试过了,但没有找到一个结论性的答案。

“引用键”在关系建模或美国英语的SQL实现中不是一个普通的技术术语


外键“引用”某个其他表中的键;这可能是混淆的原因吗?

你并不是真的把某个东西叫做参考键。。。他们是一样的。。。您可能会看到在sqlite中使用的单词references:您可以使用这样的语法来创建一个作者和书籍数据库。这可以让你展示一个作者可以有很多书。这告诉db
books.author\u id
(定义了两行)引用了
author.id

CREATE TABLE 'author' (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    firstname varchar(255)
    lastname varchar(255)
);

CREATE TABLE 'books' (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    author_id INTEGER,
    title varchar(255),
    published date,
    FOREIGN KEY(author_id) REFERENCES author(id)
);

也许您使用的术语“引用键”有点松散

一行中的外键值称为“引用”包含相应键值的行。注意前面句子中的单词“reference”是一个动词,所以我们可以说我们有一个引用外键值和一个引用键值


虽然被引用的是键值,而不是表键约束,但我想,粗略地说,我们可以说“被引用的键”是指包含可能被引用的值的行。然后我看到“引用键”如何变成“引用键”,但不掩盖其来源。

我假设您正在谈论使用
引用
,其中在约束列内联时不使用
外键
关键字,这称为列级外键约束,例如

。。。而不是放在列声明之后的表级外键约束

author_id INTEGER,
FOREIGN KEY(author_id) REFERENCES author(id)
答案是,它只是同一事物的简写语法。在两者之间进行更改时,主要关注的是可读性

对于更高级的使用,可能只有表级外键约束可以同时描述多个键上的约束,其中所有键都必须存在于引用的表中


请注意MySQL”(如SQL标准中所定义),其中引用被定义为列规范的一部分”,这意味着只有表级外键约束才能工作


和都遵守列级和表级外键约束。

外键“引用”其他表中的键。另一个表中的键称为引用键。如果您在phpmyadmin上使用图形功能,您可能会听到很多关于此的信息。

有两种方法可以声明外键:

  • 如果外键是单个属性:
    参考文献()

  • 如果外键是属性列表


  • 外键()引用

    两个关键字“外键”和“引用”关键字之间唯一也是最重要的区别在于,它们都将数据作为父表的子数据“外键”“用于创建表级约束,而REFERENCES关键字只能用于创建列级约束。仅在创建表时才能创建列级约束。但是可以使用ALTER table命令添加表级约束。

    外键必须引用主键。
    简单使用引用约束时,引用的键不必是主键

    引用键是另一个表中引用的主键。
    另一方面,外键是将第二个表链接到主表主键(或引用键)的方式。

    在标准SQL中,这两种方法都会导致外键约束

    一个表单是表约束,这意味着它可以应用于一个或多个列。要引用具有多列主键的表,需要使用此选项:

    CREATE TABLE child (
        id int PRIMARY KEY,
        parent_id int,
        date date,
        FOREIGN KEY (parent_id, date) REFERENCES parent(id, date)
    );
    
    另一种形式是列约束,这意味着它只能应用于定义它的单个列。它不能用于引用具有多列主键的表

    CREATE TABLE child (
        id int PRIMARY KEY,
        parent_id int REFERENCES parent(id)
    );
    
    上述语法的工作原理与为单个列声明表约束完全相同(假设RDBMS支持这种类型的列约束),如下所示:

    CREATE TABLE child (
        id int PRIMARY KEY,
        parent_id int,
        FOREIGN KEY (parent_id) REFERENCES parent(id)
    );
    

    对于MySQL及其InnoDB存储引擎的用户来说,后一种列约束样式不受支持,这常常会引起混淆。必须为外键定义表级约束,即使它是单列约束。这是MySQL最早出现以来的一种奇怪行为,即某些约束语法是有效的,但不会产生约束。请参阅此处的讨论:

    尽管第一个选项可以在不启用外键的情况下工作,而第二个选项则不行。第二种方法不再使用了吗?如果您尝试在MySQL Workbench中使用反向工程从数据库创建图表,这也很重要。如果在创建数据库时使用firs选项,该工具将无法在图表元素之间创建连接。那么,我们是否应该使用第二个选项,即使用
    外键
    ?@LittleZero我想关键是您可以使用您喜欢的选项。@exSnake我终于开始更新答案了,注意到MySQL和其他实现之间的差异:-)谢谢你的提示!我只是在一个例子中尝试了这个方法,我想确保一个列的值存在于另一个表中(既不是唯一的,也不是PK)。遗憾的是,你的建议不适用于这种情况。引用的列是否仍然必须是唯一的?第二个示例(代码)是应用于单列的表约束?或者它是一个列约束?它是一个表约束。但这种区别仅仅在于它在语法中出现的位置。它们都是外键约束,功能相同。我做了一个电子数据交换
    
    CREATE TABLE child (
        id int PRIMARY KEY,
        parent_id int,
        FOREIGN KEY (parent_id) REFERENCES parent(id)
    );