Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有可能在MySQL数据库中有一个不为NULL的外键指向无行?_Mysql_Sql_Database_Foreign Keys - Fatal编程技术网

是否有可能在MySQL数据库中有一个不为NULL的外键指向无行?

是否有可能在MySQL数据库中有一个不为NULL的外键指向无行?,mysql,sql,database,foreign-keys,Mysql,Sql,Database,Foreign Keys,我有一个存储服务注释的表,该表如下所示: Comment table --------------------------- comment_id (auto-increment integer, primary key) comment (string) email (string) Member table --------------------- member_id (auto-increment integer, primary key) .... some other member

我有一个存储服务注释的表,该表如下所示:

Comment table
---------------------------
comment_id (auto-increment integer, primary key)
comment (string)
email (string)
Member table
---------------------
member_id (auto-increment integer, primary key)
.... some other member info .....
email (string, unique)
现在,系统中添加了一个成员系统,一个存储成员信息的表,如下所示:

Comment table
---------------------------
comment_id (auto-increment integer, primary key)
comment (string)
email (string)
Member table
---------------------
member_id (auto-increment integer, primary key)
.... some other member info .....
email (string, unique)
一个成员可以留下多条评论,而一条评论只能由一个成员留下,也可以由非成员留下(即,成员表中不存在电子邮件)。我知道我可以通过打开一个新表(
member\u comment\u pair
)来处理它,但我想知道是否有一种方法可以在comment table中的
email
上设置外键,从而允许
email
在member table中找不到匹配项


注意:
我使用的是MySQL,但如果MySQL中不可能,但在其他类型的数据库系统中允许,我也想知道。

没有自尊的数据库系统会允许这样的事情,因为它破坏了拥有外键的全部目的。
您知道,外键是确保数据库安全的方法。
一个简短的解释是,如果引用列中不存在引用列中的数据,那么引用列中的数据就不可能存在

一旦您允许像您描述的那样的循环孔,您就可以将外键抛出窗口

我觉得MySql允许一些奇怪的事情(比如奇怪的分组行为),但是如果它允许一个坏的外键存在,它就不应该被称为关系数据库

话虽如此,您可以从至少3种可能的解决方案中选择一种:

  • 成员
    表中创建一个虚拟记录,
    注释
    表中的“孤立”记录将链接到该虚拟记录

  • 允许在
    注释
    表的
    电子邮件
    列中使用空值

  • 完全删除外键


  • 我会选择(并在需要时做过)第一个解决方案。在
    成员
    表中创建一条记录(显示名称为“guest”或其他名称),并将所有孤立的注释链接到该记录。

    任何自尊的数据库系统都不允许这样做,因为它破坏了拥有外键的全部目的。
    您知道,外键是确保数据库安全的方法。
    一个简短的解释是,如果引用列中不存在引用列中的数据,那么引用列中的数据就不可能存在

    一旦您允许像您描述的那样的循环孔,您就可以将外键抛出窗口

    我觉得MySql允许一些奇怪的事情(比如奇怪的分组行为),但是如果它允许一个坏的外键存在,它就不应该被称为关系数据库

    话虽如此,您可以从至少3种可能的解决方案中选择一种:

  • 成员
    表中创建一个虚拟记录,
    注释
    表中的“孤立”记录将链接到该虚拟记录

  • 允许在
    注释
    表的
    电子邮件
    列中使用空值

  • 完全删除外键


  • 我会选择(并在需要时做过)第一个解决方案。在
    成员
    表中创建一条记录(显示名称为“guest”或其他名称),并将所有孤立的评论链接到该记录。

    评论中的电子邮件是为了将来客人决定成为成员时的识别,因此不能设置为指向虚拟成员。它不能为空,因为电子邮件还用于对评论进行后续操作。我希望外键的功能,这样的成员不能被删除时,有评论连接到它。因此,这3种解决方案似乎不适用于我的情况……那么,不要通过电子邮件链接评论和成员,而是通过成员id链接。一旦这样做,您就拥有外键的所有好处,您可以在评论中留下您的电子邮件列供自由使用。如果评论是由已登录的成员撰写的,请自动为其填写电子邮件栏。如果是客人写的,让他们填写他们想要的任何地址。评论中的电子邮件是为了将来客人决定成为会员时的识别,因此不能设置为指向虚拟会员。它不能为空,因为电子邮件还用于对评论进行后续操作。我希望外键的功能,这样的成员不能被删除时,有评论连接到它。因此,这3种解决方案似乎不适用于我的情况……那么,不要通过电子邮件链接评论和成员,而是通过成员id链接。一旦这样做,您就拥有外键的所有好处,您可以在评论中留下您的电子邮件列供自由使用。如果评论是由已登录的成员撰写的,请自动为其填写电子邮件栏。如果是客人写的,让他们填写他们想要的任何地址。