INSERT INTO ... SELECT ... FROM ...在哪里工作?

时间:2013-07-10 16:03:52

标签: mysql sql database sqlite

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

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

不知何故,我无法理解如何做到这一点。我知道这是一种常见的情况,我甚至在堆栈溢出时发现了一两个类似的问题。我知道我们正在谈论INSERT INTO ... SELECT ... FROM .. WHERE。我假设WHERE子句是advisor.name ='anAdvisorName',但我正在努力解决这样一个事实:插入的一些信息来自一个表,而另一些则不是。 (关于这种陈述的讨论似乎集中在所有插入的数据来自第二个表的情况。这不是我所说的。)

P.S。为简单起见,请不要担心重复的条目,多个具有相同名称的顾问等等。

3 个答案:

答案 0 :(得分:6)

一种可能的方式:

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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

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

这些结果不需要完全包含来自另一个表的数据,如本例所示。

您可以将SELECT的结果直接放入另一个表中。 E.g。

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

具有相同的效果
INSERT INTO newtable
SELECT
    'Hello' AS first,
    'Everyone' AS second