插入带有外键的查询

Posted

技术标签:

【中文标题】插入带有外键的查询【英文标题】:Insert Query with Foreign Key 【发布时间】:2015-06-29 00:57:08 【问题描述】:

我在数据库中有三个表,它们通过外键相互链接。我想做一个 INSERT 查询,以便我可以输入数据。我可以单独将数据插入每个表,但是在使用外键约束时出现错误。这里是表关系和 VBA 表单,我试图通过它输入数据 VBA Form,Relationships & Data Types

我现在正在使用这两个查询,但第二个查询抛出错误。

sql = "insert into T1(ID,FName,Email)values('" & TextBox1.Text & "', '" & TextBox2.Text & "','" & TextBox3.Text & "')"
sql = "insert into T2(ID,PhoneNumber,City) Values (Select(ID FROM T1 WHERE FName=" & TextBox2.Text & "),'" & TextBox4.Text & "','" & TextBox5.Text & "')"

请注意 ID 是我表格中的主要字段,我将使用该字段进行搜索、更新和删除

【问题讨论】:

【参考方案1】:

您在第二个查询中使用的语法无效,您必须使用INSERT INTO .... SELECT .... 编写它并删除VALUES 关键字,如下所示:

INSERT INTO T2(ID,PhoneNumber,City) 
SELECT ID,'" & TextBox4.Text & "','" & TextBox5.Text & "'
FROM T1 
WHERE FName=" & TextBox2.Text & "

来自'" & TextBox4.Text & "','" & TextBox5.Text & "' 的值将与来自ID 列的值一起被选为字符串文字,这就是您可以将从查询中选择的值与字符串文字混合并将它们插入到另一个表中的方法。

【讨论】:

好的,所以我尝试了类似sql = "INSERT INTO T2(ID,PhoneNumber,City) SELECT ID,'" & TextBox4.Text & "','" & TextBox5.Text & "' FROM T1 WHERE FName=" & TextBox2.Text & " " 但现在它抛出了数据类型不匹配错误 @Sensay - 这意味着查询没问题,但你必须确保你传递给TextBox4.Text & TextBox5.Text的值的数据类型与phonenumber, city的数据类型相同,你有在将这两个文本框的值传递给查询之前验证它们的值。 我出于好奇尝试了这个查询sql = "INSERT INTO T2(ID,PhoneNumber,City) SELECT ID FROM T1 WHERE FName=" & TextBox2.Text & ",'" & TextBox4.Text & "','" & TextBox5.Text & "'",但现在它抛出 Number of query values and destination fields are not same PhoneNumber 是数字,City 是文本数据类型。 ID 是 T1 和 T2 中的数字数据类型。有趣的是,如果我编写一个简单的查询来添加电话号码和城市,它就会被添加..但正如我所说的,ID 对我来说是表格中的一个重要单元 @Sensay - 这是查询无效,你不能这样使用这种语法,正如我所说的问题不在于语法,我在回答中写的语法是正确的语法但是列之间的数据类型与您传递的值不匹配。两个表中ID 列的数据类型是什么?【参考方案2】:

Mahmoud Gamal 是对的,但必须确保列表中的字段具有相同的类型,例如,当字段为数字时,不能使用单冒号 ('),数据库承认但不正确。而且您不能将字母数字字符串发送到数字字段。最后,您必须确保查询的顺序是正确的,因为外键在级联中验证引用。请原谅我的英语。

【讨论】:

我完全同意你的看法,他是对的。但我的问题是,如果数据类型错误,那么它根本就不起作用。此外,我还没有在表单中设置任何数据验证,因此即使您在文本字段中输入数字,它也会存储为字符串。【参考方案3】:

对于您的第二个查询,我使用的是 VB.NET,因为我之前没有做过 VBA 编程:

    Dim sql As String = String.Empty
    sql = "insert into T2(ID,PhoneNumber,City) Values ("

    '// T2.ID(Number)
    sql += "Select(ID FROM T1 WHERE FName=" & TextBox2.Text & "),"

    '// T2.PhoneNumber(Number)
    '// instead of "'" & TextBox4.Text & "'," remove the single quotes
    sql += TextBox4.Text & ","

    '// T2.City(Text) only text need to be enclosed in 'single quotes'
    sql += "'" & TextBox5.Text & "'"

    sql += ")"

您的第二个查询引发错误,因为您试图将文本插入数据库中的数字列 (T2.PhoneNumber)。

包括您的图片:

【讨论】:

没关系,你是 VB.net。我会试试的。但是没有其他解决方案可以编写sql查询吗?并感谢您的帮助:) 在 VB.NET 中,您可以使用参数化查询 (SqlCommand) 使您的查询更安全。您当前的代码容易受到 SQL 注入攻击。您可以在 VB.NET here 中查看如何执行此操作的示例 谢谢,在此之前我从未考虑过安全问题。我将尝试使用 VB.NET 修改我的代码 这是一个xkcd comic,关于漏洞的严重性...:D

以上是关于插入带有外键的查询的主要内容,如果未能解决你的问题,请参考以下文章

django 插入外键值思路

使用带有外键的 Q 对象定义 django 查询集

Django 将带有外键的查询集转换为 JSON

为什么在Django上使用bulk_create插入带有外键的数据会返回“属性对象不可调用”?

如何在DJANGO里,向有外键的DB里插入数据

C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?