当前位置:首页 » 编程语言 » sql储存另一张表的字段
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql储存另一张表的字段

发布时间: 2023-06-04 16:16:54

‘壹’ sql怎样把一个表的数据插入到另一个表里

  1. 复制表结构及数据到新表select * into 目标表名 from 源表名

    数据库A中某表的的某列字段,更新到数据库B中某表的某列字段:(use master 数据库)

    update a

    set a.name=b.name

    from temp1.dbo.tableA a,temp2.dbo.tableA b

    where a.id=b.id

‘贰’ SQL 创建一个临时表#tabletemp 里面有两个字段“cn”和“dt”分别用来存储另一个表的字段名和数据类型。

提到MySQL临时表,我们都很熟悉了,一般来说,分为两类:

1. MySQL 临时表引擎,名字叫做 Memory。比如

create table tmp1(id int, str1 varchar(100) ) engine = memory;

由参数max_heap_table_size 来控制,超过报错。

2. 非临时表的引擎,这里又分为两类:

  • 用户自定义的临时表,比如:

  • create temporary table (id int, str1 varchar(100) );

  • SQL执行过程中产生的内部临时表,比如:UNION , 聚合类ORDER BY,派生表,大对象字段的查询,子查询或者半连接的固化等等场景。

  • 那么这两种临时表的计数器通常用show global status like '%tmp_%tables%' 来查看。比如

  • mysql> show status like '%tmp_%tables%';``+-------------------------+-------+``| Variable_name | Value |``+-------------------------+-------+``| Created_tmp_disk_tables | 0 |``| Created_tmp_tables | 0 |``+-------------------------+-------+``2 rows in set (0.00 sec)

  • 以上结果分别代表,只创建磁盘上的临时表计数以及临时表的总计数。这两个计数器由参数 tmp_table_size 和 max_heap_table_size 两个取最小值来控制。

    那在 MySQL 5.7 之前,这个 SQL 运行中产生的临时表是 MYISAM,而且只能是 MYISAM。那 MySQL 从 5.7 开始提供了参数 Internal_tmp_mem_storage_engine 来定义内部的临时表引擎,可选值为 MYISAM 和 INNODB 。当然这里我们选择 INNODB 。并且把内部的临时表默认保存在临时表空间 ibtmp1 (可以用参数 innodb_temp_data_file_path 设置大小以及步长等)下。当然这里我们得控制下 ibtmp1 的大小,要不然一个烂SQL就把磁盘整爆了。

    但是MySQL 5.7 之前都没有解决如下问题:

  • VARCHAR的变长存储。那就是如果临时表的字段定义是 VARCHAR(200),那么映射到内存里处理的字段变为CHAR(200)。假设 VARCHAR(200) 就存里一个字符 "Y", 那岂不是很大的浪费。

  • 大对象的默认磁盘存储,比如 TEXT,BLOB, JSON等,不管里面存放了啥,直接转化为磁盘存储。

  • MySQL 8.0 开始,专门实现了一个临时表的引擎 TempTable , 解决了 VARCHAR字段的边长存储以及大对象的内存存储。由变量 interal_tmp_mem_storage_engine来控制,可选值为 TempTable(默认)和 Memory;新引擎的大小由参数temp_table_max_ram 来控制,默认为1G。超过了则存储在磁盘上(ibtmp1)。并且计数器由性能字典的表 memory_summary_global_by_event_name 来存储。

  • mysql> SELECT * FROM performance_schema. memory_summary_global_by_event_name WHERE event_name like '%temptable%'G*************************** 1. row *************************** EVENT_NAME: **memory/temptable/physical_disk** COUNT_ALLOC: 0 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 0 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 0 HIGH_COUNT_USED: 0 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 0 HIGH_NUMBER_OF_BYTES_USED: 0*************************** 2. row *************************** EVENT_NAME: **memory/temptable/physical_ram** COUNT_ALLOC: 1 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 1048576 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 1 HIGH_COUNT_USED: 1 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 1048576 HIGH_NUMBER_OF_BYTES_USED: 10485762 rows in set (0.03 sec)

  • 以上 memory/temptable/physical_disk 代表放入磁盘上的临时表计数情况。

    memory/temptable/physical_ram 代表放入内存的临时表计数情况。

    那总结下MySQL 8.0 引入的 TempTable 引擎:

  • 默认内部临时表引擎。

  • 支持变长字符类型的实际存储。

  • 设置变量 temp_table_max_ram 来控制实际存储内存区域大小。

‘叁’ sql语句把一个表的字段插入到另外一个表

在HH中列出要插入列的列表跟select from mm表中的选择的列的列表一一对应就可以了,当然两边的数据类型应该是兼容的。

1、insert into hh (fielda,fieldb,fieldc) select fieldx,fieldy,fieldz from mm

‘肆’ sql怎样将一个表中的数据添加到另一个表

1、假如A表存在

则 insert into A(a,b,c) (select a,b,c from B)

2、假如A表不存在

select a,b,c into A from B

3、假如需要跨数据库

insert into ADB.[dbo].A(a,b,c) (select a,b,c from BDB.[dbo].B)

(4)sql储存另一张表的字段扩展阅读:

SQL导入语句

1、如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

insert into openrowset('MSDASQL',

'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',

'select * from [aa.DBF]')

select * from 表

说明:

SourceDB=c: 指定foxpro表所在的文件夹

aa.DBF 指定foxpro表的文件名.

2、导出到excel

EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c: emp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

3、/** 导入文本文件

EXEC master..xp_cmdshell 'bcp dbname..tablename in c:DT.txt -c -Sservername -Usa -Ppassword'

‘伍’ sql存储过程从一张表中查询到的值作为另一张表的新的字段

如果两表字段相同,则可以直接这样用。
insert into table_a select * from table_b
如果两表字段不同,a表需要b中的某几个字段即可,则可以如下使用:
insert into table_a(field_a1,field_a2,field_a3) select field_b1,field_b2,field_b3 from table_b
还可以加上where条件

‘陆’ 在SQL数据库中如何把一个表的同一个字段复制到同一个表的另一个字段

1、复制表结构及数据到新表select*into目标表名from源表名(要求目标表不存在,因为在插入时会自动创建)。