2013-09-05 147 views
2

我正在使用MySQL &我需要创建下列表格。从主键创建外键

1st table : having 3 attributes A,B,C 
2nd table : having 2 attributes B,D 
3rd table : having 2 attributes C,E 

现在,A是主键。

我需要创建第2到第3个表,使得第2个表中B的值应该已经存在于第1个表的B属性中,&类似地,第3个表的C中的值应该已经存在于第1个表的C中。

我尝试:

1)放了两个,第二& 3桌,&是将它作为第一个表的外键引用,&穿上级联更新只。

2)保持对第2个&第3个表的检查约束,尽管当属性来自不同的表时,我无法找到适当的检查约束语法。

PI建议更好的选择或即兴创建我想到的当前方法。

回答

3

,使得在B中第二表中的值应该是在第一表的乙属性已经存在,在&表第3章C类似值应在第一表中的Ç已经存在。

为了满足第一个要求,B必须在第一个表中声明为唯一。为了满足第二个要求,C在第一个表中必须是唯一的。因此,我们将得到的结构(数据类型的选择是任意):

Create Table FirstTable 
    (
    A varchar(50) not null Primary Key 
    , B varchar(50) Unique 
    , C varchar(50) Unique 
    ); 

Create Table SecondTable 
    (
    B varchar(50) 
    , D varchar(50) 
    ); 

Alter Table SecondTable 
    Add Constraint FK_SecondTable_FirstTable_B 
    Foreign Key (B) 
    References FirstTable (B) 
    On Update Cascade; 

Create Table ThirdTable 
    (
    C varchar(50) 
    , E varchar(50) 
    ); 

Alter Table ThirdTable 
    Add Constraint FK_ThirdTable_FirstTable_C 
    Foreign Key (C) 
    References FirstTable (C) 
    On Update Cascade; 

对于检查约束,MySQL的的“可爱”的特点之一是,虽然它解析,并接受检查约束在Create Table语句中,就评估而言,它完全忽略了它们。即:

CHECK子句被解析,但被所有存储引擎忽略。

Create Table documentation

现在,即使不是这样,在SQL语言的检查约束机制只能在当前表中的列,因此无助于解决你的问题。

+0

MySQL解析,接受并忽略内联FK约束,就像它与'CHECK'约束一样;) –

+0

@ypercube - 神圣的废话。哪个MySQL bozo认为默默地忽略关于约束的任何事情是一个好主意?! MySQL,现代时代的访问。无论如何,我已经调整为Alter Table语句。 – Thomas

+0

我认为它实际上给出警告 - 但不确定。 –

0

我不确定我完全理解这个问题。将属性B和C分别作为表2和表3的主键是不明智的。然后,您可以将它们作为第一个表中的外键引用。

+0

外键在table1中,需要从table2和table3中引用。 – dcaswell