2014-07-02 59 views
0

我真的很难理解外键是如何工作的,尽管我可以看到它们是一个非常有用的工具。了解MYSQL中的外键约束

我有一个名为seasons的表,其中包括一列season_id这是主键。还有其他一些栏目。

我有第二个表,名为dates其中包括名为hiddateseason_id(和其他几个)的列。主键包含hiddateseason_id有一个外键约束ON DELETE SET NULLON UPDATE CASCADE

这是否表示如果我删除dates中的一行,season_id将设置为nullseasons?或者相反呢?

我需要做的是当我在dates中删除一行时,seasons不受影响。但是如果我删除seasons中的一行,season_id应该设置为nulldates

回答

1

这是相反的。外键定义依赖关系:dates中的season_id必须引用seasons中的现有行。因此,如果dates中有任何引用它的行,则无法删除seasons中的一行。 ON DELETE选项指定如果删除该行,则将用NULL替换对该行的引用,以维护此要求。

所以你需要发生的事情会发生。

+0

到目前为止,这么好。但是当我试图删除一个赛季的日期时,我遇到了一个问题。我想将日期行保留在表中,但将season_id设置为null。 查询是 更新日期SET season_id =“NULL” WHERE躲在=“$藏”和日期=“$值” 但是我然后得到错误信息 不能添加或更新子行:外键约束(''lithot_extranet/dates',CONSTRAINT'dates_ibfk_19' FOREIGN KEY('season_id')REFERENCES'seasons'('season_id')ON DELETE SET NULL ON UPDATE CASCADE) – TrapezeArtist

+0

不要将'NULL'放在引号中。 – Barmar

+0

这很简单,当你知道如何!我想我还在进行,所以巴马尔的绿色勾号。 perdigueiro也值得一个,但我不知道系统是否允许其中两个。多谢你们。 – TrapezeArtist

0

基本定义是:外键是跨表的交叉引用相关数据。

在你的情况下,你有表seasons与以下数据(猜测这里)和表months。外键是season表月可以有一个ON DELETE CASCADE子句,它将DELETE操作应用于受删除季节影响的记录。因此,如果您在表格seasons上删除冬季,则相应外键的记录将被删除,我们将失去圣诞节。

season_id --- season_name || month_id --- season --- month_name 
     1  --- Winter  || 1  --- 1   January 
     2  --- Spring  || ... 
     3  --- Summer  || 7  --- 3   July 
     4  --- Autumn  || 8  --- 4   September