如何将数据从一个表复制到另一个表“另外”一个字段

时间:2014-09-11 03:33:17

标签: mysql sql

如何插入除特定字段

之外的另一个表

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个字段的现有表格,我不知道想一个一个地写它

感谢您的任何建议和回复

5 个答案:

答案 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 *原则是创建一个与源表相同的临时表,调整临时表的列字段,并将临时表的内容复制到目标表。

这就是我所做的:

  1. 创建一个名为TERRITORY_temp
  2. 的临时表

    通过运行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;

    1. 复制 插入TERRITORY_tempTerritory_IdTerritory_Name)值 (1,&#39; SouthEast&#39;), (2,&#39; SouthWest&#39;), (3,&#39; NorthEast&#39;), (4,&#39; NorthWest&#39;), (5,&#39; Central&#39;);
    2. 或 插入TERRITORY_temp SELECT * from TERRITORY_t

      1. 添加额外的字段以匹配新表

      2. 从临时表复制到目标表

      3. 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
  1. 步骤 2. 运行存储过程

    使用您的数据库名称 exec dbo.CopyDataTable 'SourceTable','TargetTable'

  2. 说明

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