MYSQL用法(十三) MySQL中INSERT INTO SELECT 的使用详解

1. 语法介绍
      有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,可以使用如下的语句来实现:

      INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name

      上面的语句比较适合两个表的数据互插,如果多个表就不适应了。对于多个表,可以先将需要查询的字段JOIN起来,然后组成一个视图后再SELECT FROM就可以了:

INSERT INTO a (field1,field2) SELECT * FROM(SELECT b.f1,c.f2 FROM b JOIN c) AS tb
 

其中f1是表b的字段,f2是表c的字段,通过JOIN查询就将分别来自表b和表c的字段进行了组合,然后再通过SELECT嵌套查询插入到表a中,这样就满足了这个场景了,如果需要不止2个表,那么可以多个JOIN的形式来组合字段。


2. 语法错误注意
      需要注意的是嵌套查询部分最后一定要有设置表别名,如下:

SELECT * FROM (SELECT f1,f2 FROM b JOIN c) AS tb

即最后的AS tb是必须的(tb这个名称可以随意取),即指定一个别名。每个派生出来的新表都必须指定别名,否则在mysql中会报如下错误:

ERROR 1248 (42000): Every derived TABLE must have its own alias

另外,MySQL中INSERT INTO SELECT不能加VALUES,即不能写成如下形式:

INSERT INTO db1_name(field1,field2) VALUES SELECT field1,field2 FROM db2_name
 

      否则也会报错:You have an error in your SQL syntax


2. 实例演示一

> INSERT INTO zodiac.uc_app_grant(VISITER_ID,VISITER_TYPE,RESOURCE_ID,GMT_GRANT) SELECT ID,'USER','4',NOW() FROM zodiac.uc_user;

3. MYSQL INSERT INTO SELECT不插入重复的数据

MYSQL 判断指定的记录值是否存在,再执行是否插入数据的写法:
此语句是插入指定的值,并且判断这些值是否存在于表中,并非复制表的数据:
INSERT INTO TABLE_NAME SELECT ?(想插入的数据,可若干个, 与表的字段对应) 

FROM DUAL(MYSQL的虚拟表) WHERE ?(想插入的数据,可若干个,与后面的SELECT对应) 

NOT IN (SELECT ?(想不重复的字段,可若干个) FROM TABLE_NAME)

例子:
表 t_test:ID, Name, Value 三个字段
+----+----------+-------+
| ID | Name     | Value |
+----+----------+-------+
|  1 | testName |     1 |
+----+----------+-------+
已有上面数据记录,
我们若插入重复的数据,则该语句会判断后再执行插入操作: 
INSERT INTO 
t_test(Name, Value) SELECT 'testName', 'testValue' FROM DUAL WHERE 'testName' NOT IN (SELECT Name FROM t_test);

上面语句表示:当testName不存在t_test表中name字段时,则插入testName, testValue于表中
执行后:
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> select * from t_test;
+----+----------+-------+
| ID | Name     | Value |
+----+----------+-------+
|  1 | testName |     1 |
+----+----------+-------+
1 row in set
因为testName存在于t_test表中,数据重复,则没写进表中。
该语句也可以直接在JDBC中使用,测试OK!

4. 实例演示二

INSERT INTO zodiac.uc_app_grant(VISITER_ID,VISITER_TYPE,RESOURCE_ID,GMT_GRANT) 

SELECT ID,'USER','4',NOW() FROM zodiac.uc_user WHERE ID IS NOT NULL;



  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值