2

I'm using MySQL & I need to create following tables.

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

Now, A is the primary key.

I need to create the 2nd-3rd tables, such that the values in B for 2nd table should be already present in 1st table's B attribute, & similarly values in C of 3rd table should be already present in C of 1st table.

My attempts :

1) put A in both, 2nd & 3rd tables, & keep them as foreign key referencing A of 1st table, & put on update cascade in each.

2) keep check constraints for both 2nd & 3rd tables, although I couldnt find proper syntax for the check constraints when attributes are from different tables.

Pl suggest better options or improvise the current approaches I've thought of.

4

2 回答 2

3

这样第二个表的 B 中的值应该已经存在于第一个表的 B 属性中,并且类似地,第三个表的 C 中的值应该已经存在于第一个表的 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 子句被解析,但被所有存储引擎忽略。

创建表文档

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

于 2013-09-05T15:54:34.017 回答
0

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

于 2013-09-05T15:47:26.190 回答