【问题标题】:MySQL - Create new table using keys from three existing tablesMySQL - 使用三个现有表中的键创建新表
【发布时间】:2011-08-09 12:15:10
【问题描述】:

如何使用现有 MySQL 表中的信息来填充新表。我有三个表,每个表都有一个我想包含在新表中的键,如下所示:

TRANSACTIONS TABLE
tr_id INT NOT NULL AUTO_INCREMENT
other columns
.
.

PEOPLE TABLE
p_id INT NOT NULL AUTO_INCREMENT
tr_id INT
other columns
.
.

HOLIDAYS TABLE
h_id INT NOT NULL AUTO_INCREMENT
tr_id INT
other columns
.
.

TRACKING TABLE
track_id INT NOT NULL AUTO_INCREMENT
tr_id
p_id
h_id
other columns
.
.

我什至不确定我是否需要新表中的 p_id 和 h_id 列,因为我只需要能够从跟踪表中获取单个 tr_id 的所有行,但它们可能有用,所以我可能会把它们留在里面。 (我确实需要他们在新表中创建行,因为一个事务可能与多个前往多个度假目的地的人相关,并且跟踪表中的每一行都与一个人的单个目的地相关,所以每个人有 2 个去到相同的 2 个度假目的地,跟踪表中将有 4 行)

我试过了:

INSERT INTO tracking (tr_id, p_id, h_id) VALUES 
(SELECT t.tr_id, p.p_id, h.h_id
  FROM transactions t 
  JOIN people p 
  JOIN holidays h
  WHERE t.tr_id = p.tr_id 
    AND t.tr_id = h.tr_id);

但这给了我一个错误。

感谢您对此提出的任何建议。非常感谢。

【问题讨论】:

  • 您遇到的错误是什么?跟踪表上的主键是什么?
  • mysql给你什么错误?它通常有一个数字/error_id。
  • ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'SELECT t.tr_id, p.p_id, h.h_id 附近使用的正确语法
  • @Joe 我已经更新了答案并提供了参考。让我知道更新的语法是否有效。

标签: mysql


【解决方案1】:

您可以跳过选择前面的值, 如果您愿意,可以使用关键字“USING” 连接在两个表中具有相同名称的列上的表。 我应该使用:

INSERT INTO tracking (tr_id, p_id, h_id)
SELECT tr_id, p_id, h_id
FROM transactions
LEFT JOIN people USING (tr_id)
LEFT JOIN holidays USING (tr_id)

【讨论】:

    【解决方案2】:

    存在语法错误。当您使用Join 时,它后面是ON 关键字,它指定需要匹配哪些列。以下查询将起作用:

    INSERT INTO tracking (tr_id, p_id, h_id) VALUES 
    (SELECT t.tr_id, p.p_id, h.h_id
    FROM transactions t 
    JOIN people p 
    on t.tr_id = p.tr_id
    JOIN holidays h
    on t.tr_id = h.tr_id)
    

    您可以通过here阅读更多关于JOINS的信息

    更新

    这应该可行:

    INSERT INTO tracking (tr_id, p_id, h_id) 
    SELECT t.tr_id, p.p_id, h.h_id
    FROM transactions t 
    JOIN people p 
    on t.tr_id = p.tr_id
    JOIN holidays h
    on t.tr_id = h.tr_id
    

    参考:MySQL Insert & Joins

    我提供的参考没有在查询中使用VALUES 关键字。奇怪的语法,但让我知道这是否有效。

    【讨论】:

    • 感谢您的回答。我确信这是我需要的,但每当我使用它时,我都会收到一条 ERROR 1064 (42000) 消息。奇怪的是,如果我只使用带有一些显式值的外部查询,它可以工作,如果我自己使用内部查询,我会得到我想要插入的值。
    • @Joe 您的tracking 表中的其他列是什么?是否定义了任何其他列,例如它们不能包含空值?其次,tr_id, p_id, h_id 是否在所有表中都定义为INT
    • 跟踪表中没有其他列(除了自动递增的track_id)。所有其他列都可以包含空值。所有值都是 INT(11)。不知道这里发生了什么。
    • @Joe 我已经用另一个查询更新了我的答案。你试过吗?语法略有定制。也提供了参考。告诉我
    • -非常感谢。现在可以了。这真的很奇怪。非常感谢您的帮助,感谢您花时间在这方面:)
    猜你喜欢
    • 2014-12-27
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多