达梦数据库常用SQL之生成启用自增列表插入功能及insert插入语句

由于工作需要,需要对有自增列的表插入数据,带自增列的表有很多,计划使用查询插入的方式来实现。

这种存在自增列表是无法直接插入数据的,需要设置IDENTITY_INSERT为ON。DM要求一个会话连接中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON,当设置一个新的表IDENTITY_INSERT 属性设置为ON时,之前已经设置为ON的表会自动还原为OFF。因此每次insert into一张表之前都要先执行一次set IDENTITY_INSERT on 的语句。

此外,insert into的语句必须要指明列名,例如:

insert into a select * from b;

上面这种方式是无法成功插入数据的,正确语句如下:

insert into a ("ID","NAME","EMAIL") select * from b;

当数据库中有多张表时,则使用以下语句即可拼出所有的查询插入语句

SELECT
        ' SET IDENTITY_INSERT "'
        ||B.NAME
        ||'" ON; INSERT INTO "'
        ||B.NAME
        ||'"("'
        ||LISTAGG(A.NAME, '","') WITHIN GROUP (
ORDER BY
        A.COLID)
        ||'") SELECT * FROM "'
        ||B.NAME
        ||'";'
FROM
        SYSCOLUMNS A
INNER JOIN SYSOBJECTS B
ON
        A.ID=B.ID
WHERE
        B.NAME IN
        (
                SELECT DISTINCT
                        S.NAME
                FROM
                        SYSOBJECTS S,
                        SYSCOLUMNS C
                WHERE
                        S.ID    =C.ID
                    AND C.INFO2 =1
                    AND S.NAME IN
                        (
                                SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME NOT LIKE 'CTI%'
                        )
        )
    AND B.SCHID=
        (
                SELECT ID FROM SYSOBJECTS WHERE TYPE$='SCH' AND NAME='SYSDBA'
        )
GROUP BY
        B.NAME;

以上SQL执行结束后,将查询结果集中的SQL语句批量执行即可。

更多内容请参考达梦数据库技术社区:https://eco.dameng.com

个人博客:Jackin's Blog

你可能感兴趣的:(达梦数据库,数据库,sql,达梦,DM8,达梦数据库)