我发现自己堆积了这个问题。我有以下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 | |
+----------------+-------------+------+-----+---------+-------+
我知道:
我应该为合同(employee_name)插入另一个外键,尽管employee表只有SSN。有没有办法将外键引用到person.name,通过员工表,如
CONSTRAINTS FOREIGN KEY contract(employee_name) REFERENCES TO person(name) WHERE person(sin)=employee(sin);
? 非常感谢您的帮助!
答案 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)
(可以证明该表中name
为UNIQUE
。)但我们不能。
如果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,通过员工表,如
如果你想弄清楚这样的情况那么你就不得不放弃使用像“外键”这样的精确术语的复制品,因为你以某种方式提醒他们所指的东西但是不存在,或使用诗意的“穿越”,或使用模糊的“类似的东西”。您必须实际写出您希望表满足的条件。