如何插入除特定字段
之外的另一个表e.g
表A
ID(auto_inc) CODE NAME
1 001 TEST1
2 002 TEST2
我想将CODE和NAME插入到另一个表中,在本例中为表B,但ID除外,因为它是自动增量
注意:我不想使用" INSERT IN TO TABLE B SELECT CODE,NAME FROM TABLE A&#34 ;,因为我有一个包含大约50个字段的现有表格,我不知道想一个一个地写它
感谢您的任何建议和回复
答案 0 :(得分:1)
如果不指定列(排除主键),则无法完成此操作。
这个问题可能会对你有所帮助。 Copy data into another table
答案 1 :(得分:1)
您可以使用information_schema.columns
获取所有列:
select group_concat(column_name separator ', ')
from information_schema.columns c
where table_name = 'tableA' and
column_name <> 'id';
这会为您提供列表。然后将列表放入您的代码中。您也可以使用准备好的声明,但准备好的声明可能有点过分。
答案 2 :(得分:1)
如果这是一次性的事情? 如果是,请插入表格(从表格B中选择*) 然后改变表格以删除不需要的列。
答案 3 :(得分:0)
我试图从一张桌子复制到另一张一张额外的场地 源表是TERRITORY_t *原则是创建一个与源表相同的临时表,调整临时表的列字段,并将临时表的内容复制到目标表。
这就是我所做的:
通过运行export
生成SQL CREATE TABLE IF NOT NOT EXISTS TERRITORY_temp
(
Territory_Id
int(11)NOT NULL,
Territory_Name
varchar(50)COLLATE utf8_unicode_ci DEFAULT NULL,
主要关键(Territory_Id
)
)ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
TERRITORY_temp
(Territory_Id
,Territory_Name
)值
(1,&#39; SouthEast&#39;),
(2,&#39; SouthWest&#39;),
(3,&#39; NorthEast&#39;),
(4,&#39; NorthWest&#39;),
(5,&#39; Central&#39;); 或
插入TERRITORY_temp
SELECT * from TERRITORY_t
添加额外的字段以匹配新表
从临时表复制到目标表
INSERT INTO TERRITORY_new
SELECT * from TERRITORY_temp
请提供反馈。
答案 4 :(得分:0)
步骤 1. 创建存储过程
CREATE PROCEDURE CopyDataTable
@SourceTable varchar(255),
@TargetTable varchar(255),
@SourceFilter nvarchar(max) = ''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SourceColumns VARCHAR(MAX)=''
DECLARE @TargetColumns VARCHAR(MAX)=''
DECLARE @Query VARCHAR(MAX)=''
SELECT
@SourceColumns = ISNULL(@SourceColumns +',', '') + T.COLUMN_NAME
FROM
(
select name as COLUMN_NAME from sys.all_columns
where object_id = (select object_id from sys.tables where name = @SourceTable)
and is_identity = 0
)T
SELECT
@TargetColumns = ISNULL(@TargetColumns +',', '') + T.COLUMN_NAME
FROM
(
select name as COLUMN_NAME from sys.all_columns
where object_id = (select object_id from sys.tables where name = @TargetTable)
and is_identity = 0
)T
set @Query = 'INSERT INTO ' + @TargetTable + ' (' + SUBSTRING(@TargetColumns,2 , 9999) + ') SELECT ' + SUBSTRING(@SourceColumns,2 , 9999) + ' FROM ' + @SourceTable + ' ' + @SourceFilter;
PRINT @Query
--EXEC(@Query)
END
GO
步骤 2. 运行存储过程
使用您的数据库名称 exec dbo.CopyDataTable 'SourceTable','TargetTable'
说明
a) dbo.CopyDataTable
会将所有数据从 SourceTable
传输到 TargetTable
,除了带有 Identity
的字段
b) 您可以在调用存储过程时应用过滤器,以便仅根据条件传输行
exec dbo.CopyDataTable 'SourceTable','TargetTable', 'WHERE FieldName=3'
exec dbo.CopyDataTable 'SourceTable','TargetTable', 'WHERE FieldName=''TextValue'''
c) 从 --
中删除 --EXEC(@Query) WHEN finish