我正在使用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建议更好的选择或即兴发挥我想到的当前方法。
答案 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子句被解析但被所有存储引擎忽略。
现在,即使不是这种情况,SQL语言中的Check约束机制也只能引用当前表中的列,因此无助于解决您的问题。
答案 1 :(得分:0)
我不确定我完全理解这个问题。将属性B和C分别作为表2和3的主键是不明智的。然后,您可以在第一个表中将它们作为外键引用。