【问题标题】:Insert data into tables linked with foreign key将数据插入到外键链接的表中
【发布时间】:2012-01-13 17:41:28
【问题描述】:

首先我尝试了这个Insert Data Into Tables Linked by Foreign Key 并没有得到答案。

我有 3 张桌子:

表格:客户

ID -------LastName-------FirstName-------PhoneNumber

表格:顺序

ID-------Status-------CustomerID

表格:OrderLine

ID-------OrderID-------Product-------Quantity-------PricePerUnit

我运行以下查询

SqlCommand myCommand2 = 
   new SqlCommand(@"INSERT INTO Order (Status, CustomerID) 
                    VALUES(13016, SELECT ID FROM Customers WHERE FirstName = 'Garderp')", 
                  myConnection);`

它会抛出异常

Order 附近的语法错误

如何在 SQL Server 2008 中使用外键将数据添加到表中,尤其是在这种特殊情况下?

【问题讨论】:

  • 仅供参考,您只能接受一个答案 :) 我认为 Icarus 拥有最完整的答案。

标签: c# sql-server-2008 foreign-keys


【解决方案1】:

ORDER 是 SQL Server 中的保留关键字(用于ORDER BY 操作)。

您需要用方括号分隔该名称:

"INSERT INTO [Order] (Status, CustomerID) VALUES "

这将导致 SQL Server 将其视为对象名称,而不是将其读取为关键字。

【讨论】:

    【解决方案2】:

    应该是:

    SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO [Order] (Status, CustomerID) " 
       + " SELECT 13016, ID 
           FROM Customers 
           WHERE FirstName = 'Garderp')"
    , myConnection);
    

    【讨论】:

    • 您的 SQL 语句缺少 (
    【解决方案3】:

    顺序是SQL中的关键字,如果使用它作为表名或列,则必须将所有关键字括起来。

    【讨论】:

      【解决方案4】:

      尝试使用此查询

      INSERT INTO [Order]
      ( Status, CustomerID )
      SELECT 13016, ID
          FROM Customers
          WHERE FirstName = 'Garderp'
      

      【讨论】:

        【解决方案5】:
        SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO Order 
        (Status, CustomerID)
        VALUES " + "(13016, 
        (SELECT ID FROM Customers WHERE FirstName = 'Garderp'))", myConnection);
        

        【讨论】:

          【解决方案6】:

          试试这个

          SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO Order (Status, CustomerID) VALUES " + "(13016, SELECT ID FROM Customers WHERE FirstName = \'Garderp\')", myConnection);
          

          如果有多个名为“Gardep”的客户,此查询将失败。您只需选择一条记录。在这里使用 TOP 会更好

          SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO Order (Status, CustomerID) VALUES " + "(13016, SELECT TOP 1 ID FROM Customers WHERE FirstName = \'Garderp\')", myConnection);
          

          【讨论】:

          • -1 - 您已经提供了 20 个答案,此时应该知道如何标记代码。
          • 这也是一个糟糕的答案,因为您没有考虑将保留字用作表名,并且TOP 1 将丢弃他可能想要的其他结果。
          • 如果你不使用 top 1 并且有多行,查询将失败。你看起来像个新手。不,我不知道如何格式化代码。我相信如果你有技能,你不需要勺子喂
          • 实际上,如果您将其设为SELECT 13016, id from customers,它不会失败,这是错误答案的另一个原因-该方法不适合该问题。代码标签不是为了喂汤,而是为了让代码更具可读性。
          猜你喜欢
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-04
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          相关资源
          最近更新 更多