从主键创建外键

时间:2013-09-05 14:26:01

标签: mysql

我正在使用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)将A放入2,&第3桌,&保留它们作为引用第一表A的外键,&在每个中加上更新级联。

2)继续检查第二和第二的约束条件。第3个表,虽然当属性来自不同的表时,我无法找到检查约束的正确语法。

Pl建议更好的选择或即兴发挥我想到的当前方法。

2 个答案:

答案 0 :(得分:3)

  

这样第二个表中B的值应该已经存在于第一个表的B属性中,&类似于第3表的C中的值应该已经存在于第1表的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语言中的Check约束机制也只能引用当前表中的列,因此无助于解决您的问题。

答案 1 :(得分:0)

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