帮助INSERT INTO..SELECT

时间:2011-05-13 22:19:27

标签: mysql insert

我在Table_A中插入了大量的行。 Table_A包括指向Table_B.B_ID的B_ID列。

表B只有两列:Table_B.B_ID(主键)和Table_B.Name。

我知道除了B_ID之外我插入的每个Table_A字段的值。我只知道相应的Table_B.Name。那么如何在Table_A中插入多行?

这是我想要做的伪代码版本:

REPLACE INTO Table_A (Table_A.A_ID, Table_A.Field, Table_A.B_ID) VALUES
(1, 'foo', [SELECT B_ID FROM Table_B WHERE Table_B.Name = 'A'),
(2, 'bar', [SELECT B_ID FROM Table_B WHERE Table_B.Name = 'B'),...etc

2 个答案:

答案 0 :(得分:1)

在将脚本部署到环境中Ids不同的生产环境时,我不得不做这样的事情。否则,输入ID的

可能更容易
REPLACE INTO table_a (table_a.a_id, table_a.field, table_a.b_id) 
SELECT 1, 'foo', b_id, FROM table_b WHERE name = 'A' 
UNION ALL SELECT 2, 'bar', b_id, FROM table_b WHERE name = 'B' 

答案 1 :(得分:0)

如果值:

(1, 'foo', 'A'),
(2, 'bar', 'B'),

来自(SELECT ...)

你可以用这个:

INSERT INTO Table_A
    ( A_ID, Fld, B_ID)

SELECT Data.A_ID
     , Data.Field
     , Table_B.B_ID
    FROM (SELECT ...) As Data
        JOIN Table_B
            ON Table_B.Name = Data.Name

如果没有,您可以将它们插入临时表中,然后使用上述内容,将(SELECT ...)替换为TemporaryTable

CREATE TABLE HelpTable
    ( A_ID int
    , Fld varchar(200)
    , Name varchar(200)
    ) ;

INSERT INTO HelpTable
VALUES
(1, 'foo', 'A'),
(2, 'bar', 'B'), etc...
;

INSERT INTO Table_A
    ( A_ID, Field, B_ID)
SELECT HelpTable.A_ID
     , HelpTable.Fld
     , Table_B.B_ID
    FROM HelpTable 
        JOIN Table_B
            ON Table_B.Name = HelpTable.Name
;

DROP TABLE HelpTable ;