【问题标题】:How does INSERT INTO ... SELECT ... FROM ... WHERE work?INSERT INTO ... SELECT ... FROM ... WHERE 如何工作?
【发布时间】:2013-07-10 16:03:51
【问题描述】:

假设我有一个表STUDENT,其中的列包括IDnameemailadvisorID。我还有第二张表ADVISOR,其中的字段包括IDnameSTUDENT.AdvisorID 是外键。插入学生时,您必须有一个指向 ADVISOR 的键。

但是,从应用程序插入学生时,您只有一个 ADVISOR 名称。换句话说,您有包含特定学生姓名和电子邮件以及顾问姓名的字符串,但没有顾问 ID。

不知何故,我无法理解如何做到这一点。我知道这是一种常见的情况,我什至发现过去在 stackoverflow 上问过一两个类似的 Q。我知道我们在谈论 INSERT INTO ... SELECT ... FROM .. WHERE。我假设 WHERE 子句是 advisor.name='anAdvisorName' 但我正在为插入的一些信息来自表而有些不是这一事实而苦苦挣扎。 (关于这种说法的讨论似乎集中在所有插入的数据都来自第二个表的情况。这不是我要说的。)

附言为简单起见,请不要担心重复条目、多个顾问同名等问题。

【问题讨论】:

    标签: mysql sql database sqlite


    【解决方案1】:

    一种可能的方式:

    insert into student (name, email, advisorID)
        values (
            'Fred Smith',
            'fred@example.com',
            (select id from advisor where name = 'Lord Voldemort'))
    

    【讨论】:

      【解决方案2】:

      首先,您不必使用INSERT INTO SELECT 来执行此操作。您可以简单地先插入Advison,检查分配的ID,然后在插入Student 实体时使用它。

      如果你还是想使用INSERT INTO SELECT,你可以这样做:

      INSERT INTO Student (name, email, advisorID)
      SELECT 'studentName', 'studentEmail', ID
      FROM Advisor
      WHERE advisorName = 'advisonName'
      

      【讨论】:

      • 这很有帮助。我一直在考虑 SELECT 语句,在这种情况下,总是涉及“选择”某些东西(从另一个表中)。我不知道可以直接在 SELECT 语句中包含字段值。这似乎仍然有点违反直觉,但真的很高兴知道。谢谢。
      【解决方案3】:

      当您选择时,您会得到一个结果表,例如:

      mysql> select 'Hello' AS first, 'Everyone' AS second;
      +-------+----------+
      | first | second   |
      +-------+----------+
      | Hello | Everyone |
      +-------+----------+
      1 row in set (0.00 sec)
      

      这些结果不需要像本例中那样完全包含另一个表中的数据。

      您可以将 SELECT 的结果直接放入另一个表中。例如

      INSERT INTO newtable
          ( first, second )
      VALUES
          ( 'Hello', 'Everyone' )
      

      效果和

      一样
      INSERT INTO newtable
      SELECT
          'Hello' AS first,
          'Everyone' AS second
      

      【讨论】:

        猜你喜欢
        • 2016-06-05
        • 2012-06-08
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 2020-07-13
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多