【问题标题】:how to select more than one foreign key in a mysql query如何在mysql查询中选择多个外键
【发布时间】:2014-07-10 15:25:27
【问题描述】:

所以我想使用 mysql 在表中插入一个新列。

这是 w3schools 的插入函数示例

INSERT INTO Customers (CustomerName, Country)
SELECT SupplierName, Country FROM Suppliers
WHERE Country='Germany';

我尝试对其进行一些修改,以便基本上从另外两个表中选择和插入特定的整数值。我尝试了几种不同的方法,但没有运气。这是我大致想做的事情:

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT int1 FROM table1 WHERE aString = "something",
       int2 FROM table2 WHERE bString = "otherthing",
       0;

上面的代码不是有效的语法。我必须调整什么才能做出选择?还是我必须尝试完全不同的东西?非常感谢。

【问题讨论】:

  • 用英文描述你想做什么。 “基本上”和“大致”不会神奇地传达你想要的东西,或者不说你想要的东西。还要给出定义表的 SQL。也总是给出确切的错误信息。

标签: mysql sql insert foreign-keys subquery


【解决方案1】:

只要子查询仅返回一行 (SQL Fiddle),以下内容将适用于您:

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
SELECT (SELECT int1 FROM table1 WHERE aString = "something") AS integerVar1,
       (SELECT int2 FROM table2 WHERE bString = "otherthing") AS integerVar2, 0

如果它们有可能返回多于一行,那么您应该通过更详细的 where 子句或使用 limit 子句来缩小结果范围。

【讨论】:

    【解决方案2】:

    您需要在子选择中包含每个,如下所示:

    INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
    SELECT (SELECT int1 FROM table1 WHERE aString = 'something'),
           (SELECT int2 FROM table2 WHERE bString = 'otherthing'),
           0;
    

    但是,请记住,如果子选择返回多个值,它将不起作用。

    这样使用会更安全:

    INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
    SELECT (SELECT int1 FROM table1 WHERE aString = 'something' LIMIT 1),
           (SELECT int2 FROM table2 WHERE bString = 'otherthing' LIMIT 1),
           0;
    

    【讨论】:

    • 关于多个匹配的好点,但是,如果查询返回 OP 期望的多行,我会说这是应该在设计级别解决的问题。
    【解决方案3】:

    其他答案显示了如何使用子查询来检索所需的值。我要补充一点,因为您 [似乎] 期望每个字符串都有一个匹配项,您也可以使用 INSERT...VALUES 语法而不是 INSERT...SELECT:

    INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
    VALUES
    (
      (SELECT int1 FROM table1 WHERE aString = 'something'),
      (SELECT int2 FROM table2 WHERE bString = 'otherthing'),
      0
    );
    

    但这只不过是一种语法变化(在这种特殊情况下)。

    我实际上想提请您注意的是,两个子查询中的每一个都可能返回一个空集,因此评估为标量 NULL。如果其中一个或两个引用为 NULL,您还想插入该行吗?

    如果您不希望查询在这种情况下插入行,您可以考虑采用这种方法:

    INSERT INTO table0 (integerVar1, integerVar2, booleanVar1)
    SELECT
      t1.int1, t2.int2, 0
    FROM
      (SELECT int1 FROM table1 WHERE aString = 'something') AS t1
    CROSS JOIN
      (SELECT int2 FROM table2 WHERE bString = 'otherthing') AS t2
    ;
    

    如果其中一个子查询没有返回行,则这两个集合的交叉连接将为空,因此 INSERT 不会将任何行插入table0。

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 2011-08-21
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2013-07-06
      • 2014-11-09
      相关资源
      最近更新 更多