MYSQL多行INSERT WHERE NOT EXISTS

时间:2012-04-06 05:36:13

标签: mysql sql insert

我到处寻找,找不到这样的东西。我有两个表,第一个表t1为每个a1值包含 12 条目,b1值对于除{1}}之外的所有a1都是静态的。 a1b1都不是主键。 t1还有所有a1的其他静态列。

表格二t2a2b2值不是静态的。 a2b2都不是主键(我使用主键的独立id列)。

我的目标是导入a2中不存在的所有t1值。请记住,表1目前有大约200万个条目,表2通常有150K-1M条目。

这有效:

INSERT t1 ( a1, b1, c1, d1 )
SELECT a2, b2, 'constant1', 'constant2'
FROM t2 AS V2
WHERE NOT EXISTS ( SELECT 1 FROM t1 WHERE a1=V2.a2 )

但它只会在a2中输入一个t1条目,而 11 会丢失条目。

这是我的想法:

SELECT a2, b2 FROM t2 AS V2
INSERT INTO t1 ( a1, b1, c1, d1 )
       VALUES  ( V2.a2, V2.b2, 'constant1', 'constant2' ),
               ( V2.a2, 'constant3', 'constant1', 'constant2'),
               ( V2.a2, 'constant4', 'constant1', 'constant2'),
               ( V2.a2, 'constant5', 'constant1', 'constant2'),
               ( V2.a2, 'constant6', 'constant1', 'constant2'),
               ( V2.a2, 'constant7', 'constant1', 'constant2'),
               ( V2.a2, 'constant8', 'constant1', 'constant2'),
               ( V2.a2, 'constant9', 'constant1', 'constant2'),
               ( V2.a2, 'constant10', 'constant1', 'constant2'),
               ( V2.a2, 'constant11', 'constant1', 'constant2'),
               ( V2.a2, 'constant12', 'constant1', 'constant2'),
               ( V2.a2, 'constant13', 'constant1', 'constant2')
WHERE NOT EXISTS ( SELECT 1 FROM t1 WHERE a1=V2.a2 )

这样的事情可能吗? (这显然不起作用,主要的语法错误)。

来自实际表的示例数据:

 +---------+------+-------------+-------------+--------------+
 | id      | name | destination | application | durationRate |
 +---------+------+-------------+-------------+--------------+
 |   45013 | 1    | 1305200     | audio       | 0            | 
 |  335203 | 2    | 1305200     | audio       | 0.014        | 
 |  625393 | 3    | 1305200     | audio       | 0.005928     | 
 |  956657 | 4    | 1305200     | audio       | 0            | 
 | 1251735 | 5    | 1305200     | audio       | 0            | 
 | 1560365 | 6    | 1305200     | audio       | 0.02         | 
 | 1868995 | 7    | 1305200     | audio       | 0.014        | 
 | 2200259 | 9    | 1305200     | audio       | 0.014        | 
 | 2517971 | 10   | 1305200     | audio       | 0.018        | 
 | 2813049 | 11   | 1305200     | audio       | 0.018        | 
 | 3121679 | 12   | 1305200     | audio       | 0.00775      | 
 | 3430309 | 8    | 1305200     | audio       | 0            | 
 |   45015 | 1    | 1305201     | audio       | 0            | 
 |  335205 | 2    | 1305201     | audio       | 0.014        | 
 |  625395 | 3    | 1305201     | audio       | 0.006552     | 
 |  956659 | 4    | 1305201     | audio       | 0            | 
 | 1251737 | 5    | 1305201     | audio       | 0            | 
 | 1560367 | 6    | 1305201     | audio       | 0.02         | 
 | 1868997 | 7    | 1305201     | audio       | 0.014        | 
 | 2200261 | 9    | 1305201     | audio       | 0.014        | 
 | 2517973 | 10   | 1305201     | audio       | 0.018        | 
 | 2813051 | 11   | 1305201     | audio       | 0.018        | 
 | 3121681 | 12   | 1305201     | audio       | 0.00775      | 
 | 3430311 | 8    | 1305201     | audio       | 0            | 
 |   45017 | 1    | 1305202     | audio       | 0            | 
 |  335207 | 2    | 1305202     | audio       | 0.014        | 
 |  625397 | 3    | 1305202     | audio       | 0.00468      | 
 |  956661 | 4    | 1305202     | audio       | 0            | 
 | 1251739 | 5    | 1305202     | audio       | 0            | 
 | 1560369 | 6    | 1305202     | audio       | 0.02         | 
 | 1868999 | 7    | 1305202     | audio       | 0.014        | 
 | 2200263 | 9    | 1305202     | audio       | 0.014        | 
 | 2517975 | 10   | 1305202     | audio       | 0.018        | 
 | 2813053 | 11   | 1305202     | audio       | 0.018        | 
 | 3121683 | 12   | 1305202     | audio       | 0.00775      | 
 | 3430313 | 8    | 1305202     | audio       | 0            | 
 +---------+------+-------------+-------------+--------------+
 36 rows in set (0.00 sec)

在我的示例表中,a1 = destinationb1 = durationRatec1 = named1 = application name定义了12种不同的费率套牌。

2 个答案:

答案 0 :(得分:2)

where子句中使用更具体的条件。我在这里添加了另一个专栏,但它只能使用ID对a1b1是唯一的,如果不是你应该添加更多列来调整。

INSERT t1 ( a1, b1, c1, d1 )
SELECT a2, b2, 'constant1', 'constant2'
FROM t2 AS V2
WHERE NOT EXISTS (
    SELECT 1 
    FROM t1 WHERE a1 = V2.a2 and b1 = V2.b2
)

答案 1 :(得分:0)

好的,我想我明白你现在想要什么。

您要为每个新的a2值创建11行,这些值应使用与其他同名列(c1)值相同的值填充(旁注释 - 这不是规范化表的机会)并减少存储的数据量?)。那么给定a2值的第十二行应该具有t2中指定的b1的唯一值。

创建此方法的一种方法是首先使用标准11值填充临时表。然后使用它加上t2中的条目来获取要插入的行

使用SQL Server语法:

insert into @staticValues (c1, otherCol, b1)  
select c1, otherCol, b1  
from t1  
where a1 = 1305202 -- arbitrary sample existing value  
and c1 <> 3 -- ignoring the varying row

insert into t1 (a1, c1, otherCol, b1)  
select t2.a2, sv.c1, sv.otherCol, sv.b1  
from @staticValues sv  
  inner join t2 on t2.a2 = t2.a2 -- equivalent to a cross join  
where not exists (select 1 from t1 where t1.a1 = t2.a2)  
union  
select t2.a2, 3, 'audio', t2.b2  
from t2  
where not exists (select 1 from t1 where t1.a1 = t2.a2)