通过更多表

时间:2016-11-13 13:55:42

标签: mysql foreign-keys

我发现自己堆积了这个问题。我有以下3个表格,我无法修改(它非常好):

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| SSN        | varchar(50) | NO   | PRI | NULL    |       |
| name       | varchar(50) | YES  | UNI | NULL    |       |
| birthday   | date        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

员工

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| SSN        | varchar(50) | NO   | PRI | NULL    |       |
| department | varchar(50) | YES  |     | NULL    |       |
| salary     | varchar(50) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

雇主

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| name       | varchar(50) | NO   | PRI | NULL    |       |
| department | varchar(50) | YES  |     | NULL    |       |
| salary     | varchar(50) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

合同

+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employer_name  | varchar(50) | NO   | PRI | NULL    |       |
| employee_name  | varchar(50) | YES  | PRI | NULL    |       |
+----------------+-------------+------+-----+---------+-------+

我知道:

  • 员工(罪)是人(罪)的外键,
  • 雇主(姓名)是人(姓名)的外键,
  • 合同(employer_name)是雇主的外键(姓名)

我应该为合同(employee_name)插入另一个外键,尽管employee表只有SSN。有没有办法将外键引用到person.name,通过员工表,如

CONSTRAINTS FOREIGN KEY contract(employee_name) REFERENCES TO person(name) WHERE person(sin)=employee(sin);

? 非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

SQL FK约束表明其引用列列表子行值(如果全部为非NULL)必须显示为其引用列列表的子行值,该列表必须在基表中声明为UNIQUE / PK。

您的约束不是SQL FK约束。

如果我们可以在SQL FK约束中使用查询代替引用的基表名,那么您需要的约束是:

Contract(person_name) REFERENCES
    (SELECT name FROM Person p JOIN Employee e ON p.name = e.name)(name)

(可以证明该表中nameUNIQUE。)但我们不能。

如果MySQL支持CREATE ASSERTION,那么CHECK Contract person_name IN (SELECT name FROM Person p JOIN Employee e ON p.name = e.name) static void Main(string[] args) { SyntaxTree tree = CSharpSyntaxTree.ParseText( @"using System; namespace HelloWorld { public class MyType{public void MyMethod(){}} }" ); var root = (CompilationUnitSyntax)tree.GetRoot(); var compilation = CSharpCompilation.Create("HelloWorld") .AddReferences( MetadataReference.CreateFromFile( typeof(object).Assembly.Location)) .AddSyntaxTrees(tree); var model = compilation.GetSemanticModel(tree); var myTypeSyntax = root.DescendantNodes().OfType<TypeDeclarationSyntax>().First(); var myTypeInfo = model.GetDeclaredSymbol(myTypeSyntax); Console.WriteLine(myTypeInfo); } myTypeInfo。但事实并非如此。

因此,这是一个约束的示例,如果您无法重新设计表,则在涉及的表发生更改时,您将通过适当的触发器强制执行。

  

有没有办法将外键引用到person.name,通过员工表,如

如果你想弄清楚这样的情况那么你就不得不放弃使用像“外键”这样的精确术语的复制品,因为你以某种方式提醒他们所指的东西但是不存在,或使用诗意的“穿越”,或使用模糊的“类似的东西”。您必须实际写出您希望表满足的条件。