是否有可能有一个NOT NULL的外键指向MySQL数据库中没有行?

时间:2017-08-02 04:32:54

标签: mysql sql database foreign-keys

我有一个存储服务注释的表,该表看起来像这样:

<?php
$arrayname=array('iqbal', 'rezza');
$arrayaddress=array('teloyo', 'karang rejo');
for ($x = 0; $x <= 1; $x++)
{
    $name=$arrayname[$x]; 
    $address=$arrayaddress[$x];   // indent consistently!!
?>

<script>
    function call()
    {
        var nik = "<?php echo $name ?>";    // semicolons not needed in the embedded PHP code
        var addres = "<?php echo $address ?>";   // indent consistently!!
        alert(nik+address);
    }
</script>

<a href="javascript:call();"><?php echo $name ?></a>

<?php
} ?>

现在,会员系统被添加到系统中,这是一个存储会员信息的表,如下所示:

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_comment_pair上设置外键,这样它就允许{ {1}}可能无法在成员表中找到匹配项?

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

1 个答案:

答案 0 :(得分:2)

没有自尊的数据库系统会允许这样的事情,因为它违背了拥有外键的全部目的 你看,外键是确保relational integrity的数据库方式 一个简短的解释是,如果引用列中的数据不存在,则引用列中的数据不会存在。

一旦你允许一个像你所描述的循环洞,你也可以把外键扔出窗外。

我似乎有些奇怪的事情,MySql允许(就像它的行为一样奇怪的组),但如果它允许存在损坏的外键,则不应将其称为关系数据库。

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

  1. Member表中创建一个虚拟记录,Comment表中的“孤儿”记录将链接到该记录。

  2. Comment表的email列中允许空值。

  3. 完全删除外键。

  4. 我会选择(并且在需要之前完成)第一个解决方案。在Member表中创建一条记录(将其显示名称设置为“guest”或其他)并将所有孤立注释链接到该表。