免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5878 | 回复: 14
打印 上一主题 下一主题

规范主键名及索引名的脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-31 20:17 |只看该作者 |倒序浏览
5可用积分
标准化主键名及索引名、删除重复索引(sqlserver2000),主键名为PK_表名_字段1_字段2,索引名为PI_表名_字段1_字段2
思路:以GO为记录分格符,取出ALTER TABLE.*ADD.*PRIMARY KEY及CREATE INDEX的段,取出其中的表名及()中的字段名,转为索引或主键名,代替原名
我想用awk写,可awk不支持gsub(".*ALTER TABLE \[[a-zA_Z0-9\_]*\]\.\[\([a-zA_Z0-9\_]*\)\]","\1")模式匹配,哪位帮写一下.
不限awk,sed、perl均可


ALTER TABLE [dbo].[agent_post_reg] WITH NOCHECK ADD
        CONSTRAINT [PK_agent_post_reg] PRIMARY KEY  CLUSTERED
        (
                [agnet_post_id]
        ) WITH  FILLFACTOR = 90  ON [PRIMARY]
GO

ALTER TABLE [dbo].[agentorg] WITH NOCHECK ADD
         PRIMARY KEY  CLUSTERED
        (
                [agentorg_type_code],
                [agentorg_code]
        ) WITH  FILLFACTOR = 90  ON [PRIMARY]
GO

CREATE  INDEX [IX_std_contract_6_cc] ON [dbo].[std_contract]([n_sales_branch_no], [n_sales_code]) WITH  FILLFACTOR = 90 ON [PRIMARY]
GO

CREATE  INDEX [IX_std_contract_7_cc] ON [dbo].[std_contract]([master_cntr_id]) WITH  FILLFACTOR = 90 ON [PRIMARY]
GO

转为
ALTER TABLE [dbo].[agent_post_reg] WITH NOCHECK ADD
        CONSTRAINT [PK_agent_post_reg_agnet_post_id] PRIMARY KEY  CLUSTERED
        (
                [agnet_post_id]
        ) WITH  FILLFACTOR = 90  ON [PRIMARY]
GO

ALTER TABLE [dbo].[agentorg] WITH NOCHECK ADD
         CONSTRAINT [PK_agentorg_agentorg_type_code_agentorg_code] PRIMARY KEY  CLUSTERED
        (
                [agentorg_type_code],
                [agentorg_code]
        ) WITH  FILLFACTOR = 90  ON [PRIMARY]
GO

CREATE  INDEX [PI_std_contract_n_sales_branch_no_n_sales_code] ON [dbo].[std_contract]([n_sales_branch_no], [n_sales_code]) WITH  FILLFACTOR = 90 ON [PRIMARY]
GO

CREATE  INDEX [PI_std_contract_master_cntr_id] ON [dbo].[std_contract]([master_cntr_id]) WITH  FILLFACTOR = 90 ON [PRIMARY]
GO


我自己已搞定,(linux及cygwin、SCO507下测试通过。因无名主键不易删除,故主键名未改名重建,但取出来参加与索引比较是否重复)
支持的顶一下,请版主置保留或原创。
哪位有兴趣翻成perl,我来学习一下,给加分。

改用gawk,在SCO507下测试通过。
formatindex.sh.gz (902 Bytes, 下载次数: 67)

for informix版本(不过informix索引名长度不能超过18,完全重复的索引建不了。清理索引时有用,能将有索引的表名字段名全显出来,一个索引一行):
formatindexi.sh.gz (868 Bytes, 下载次数: 56)

[ 本帖最后由 zhangshebao 于 2007-9-1 23:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-31 20:38 |只看该作者
不理解 表达的 意思。。。 可否简单表达

论坛徽章:
0
3 [报告]
发表于 2007-08-31 20:52 |只看该作者
红色部分原来不规范,现在要规范取名,主键名字由PK_表名_字段名_字段名组成,索引名字由PI_表名_字段名_字段名组成,alter table及后的一个字段是表名(去掉属主部分
  • .),create index的ON与(这间的字段是表名,()内的是字段名,字段个数不定.
    即将第1段sql规范化为第2段sql文本.
  • 论坛徽章:
    0
    4 [报告]
    发表于 2007-09-01 09:34 |只看该作者
    我昨晚 尝试了下 还没有给你做出来 不过 有了个思路了 我再去试试。

    论坛徽章:
    0
    5 [报告]
    发表于 2007-09-01 10:33 |只看该作者
    gsub不能匹配模式,match能匹配模式到数组中:
    echo "cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989"|awk '
    {r=match($0,"([a-z0-9]*) *([a-z0-9]*)",a);
    print "line=<",$0,">,r=",r;
    for (i in a) print "a[",i,"]=<",a[i],">";
    }'
    line=< cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989 >,r= 1
    a[ 0start ]=< 1 >
    a[ 0length ]=< 10 >
    a[ 1start ]=< 1 >
    a[ 2start ]=< 8 >
    a[ 0 ]=< cdrom  man >
    a[ 1 ]=< cdrom >
    a[ 2 ]=< man >
    a[ 2length ]=< 3 >
    a[ 1length ]=< 5 >[/i]

    [[i] 本帖最后由 zhangshebao 于 2007-9-9 10:29 编辑 [/i]]

    论坛徽章:
    0
    6 [报告]
    发表于 2007-09-01 10:53 |只看该作者
    有点怪,第1例比第2例多个*,结果第2个及第3个括号就匹配成空了:
    [root@asterisk1 tmp]# echo "cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989"|awk '
    {r=match($0,"([a-z0-9\.]*)( *([a-z0-9\.]*))*",a);
    print "line=<",$0,">,r=",r;
    for (ii in a) print "a[",ii,"]=<",a[ii],">";
    }'
    line=< cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989 >,r= 1
    a[ 0start ]=< 1 >
    a[ 0length ]=< 30 >
    a[ 3start ]=< 31 >
    a[ 1start ]=< 1 >
    a[ 2start ]=< 31 >
    a[ 0 ]=< cdrom  man.jm3100  maxtor  ssh >
    a[ 1 ]=< cdrom >
    a[ 2 ]=<  >
    a[ 3length ]=< 0 >
    a[ 3 ]=<  >
    a[ 2length ]=< 0 >
    a[ 1length ]=< 5 >
    [root@asterisk1 tmp]# echo "cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989"|awk '
    {r=match($0,"([a-z0-9\.]*)( *([a-z0-9\.]*))",a);
    print "line=<",$0,">,r=",r;
    for (ii in a) print "a[",ii,"]=<",a[ii],">";
    }'
    line=< cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989 >,r= 1
    a[ 0start ]=< 1 >
    a[ 0length ]=< 17 >
    a[ 3start ]=< 8 >
    a[ 1start ]=< 1 >
    a[ 2start ]=< 6 >
    a[ 0 ]=< cdrom  man.jm3100 >
    a[ 1 ]=< cdrom >
    a[ 2 ]=<   man.jm3100 >
    a[ 3length ]=< 10 >
    a[ 3 ]=< man.jm3100 >
    a[ 2length ]=< 12 >
    a[ 1length ]=< 5 >

    [ 本帖最后由 zhangshebao 于 2007-9-1 11:22 编辑 ]

    论坛徽章:
    1
    荣誉会员
日期:2011-11-23 16:44:17
    7 [报告]
    发表于 2007-09-01 12:44 |只看该作者
    看着就 晕, 嘿嘿嘿

    论坛徽章:
    0
    8 [报告]
    发表于 2007-09-01 14:21 |只看该作者

    match中()后加*的不同结果

    原帖由 zhangshebao 于 2007-9-1 10:53 发表
    有点怪,第1例比第2例多个*,结果第2个及第3个括号就匹配成空了:
    [root@asterisk1 tmp]# echo "cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989"|awk '
    {r=match($0,"([a-z0-9\.]*)( *([a-z0-9\.]* ...


    6楼的结果是在这个环境下运行的
    [root@asterisk1 tmp]# awk --version
    GNU Awk 3.1.3
    Copyright (C) 1989, 1991-2003 Free Software Foundation.
    经测试这个环境()后加了*或者\{0,n\},n大于可匹配的次数,就只能取到空了,前面匹配的结果被后面的空冲掉了.


    换个环境,在cygwin取到最后一次非空匹配的结果
    bash-3.2$ echo "cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989"|awk
    '
    > {r=match($0,"([a-z0-9\.]*)( *([a-z0-9\.]*))*",a);
    > print "line=<",$0,">,r=",r;
    > for (ii in a) print "a[",ii,"]=<",a[ii],">";
    > }'
    awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
    line=< cdrom  man.jm3100  maxtor  ssh-cPNkwQ3110  ssh-rPdESI2989 >,r= 1
    a[ 0start ]=< 1 >
    a[ 0length ]=< 30 >
    a[ 3start ]=< 28 >
    a[ 1start ]=< 1 >
    a[ 2start ]=< 26 >
    a[ 0 ]=< cdrom  man.jm3100  maxtor  ssh >
    a[ 1 ]=< cdrom >
    a[ 2 ]=<   ssh >
    a[ 3length ]=< 3 >
    a[ 3 ]=< ssh >
    a[ 2length ]=< 5 >
    a[ 1length ]=< 5 >
    bash-3.2$ awk --version
    GNU Awk 3.1.5
    Copyright (C) 1989, 1991-2005 Free Software Foundation.

    [ 本帖最后由 zhangshebao 于 2007-9-1 14:33 编辑 ]

    论坛徽章:
    0
    9 [报告]
    发表于 2007-09-01 18:05 |只看该作者

    规范索引名、删除重复索引(sql2000脚本)

    我自己解出来了。
    支持的顶一下,请版主置保留或原创。
    哪位有兴趣翻成perl,我来学习一下,加分。

    bash-3.2$ echo "ALTER TABLE [dbo].[agent_post_reg] WITH NOCHECK ADD
            CONSTRAINT [PK_agent_post_reg] PRIMARY KEY  CLUSTERED
            (
                    [agnet_post_id]
            ) WITH  FILLFACTOR = 90  ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[agentorg] WITH NOCHECK ADD
             PRIMARY KEY  CLUSTERED
            (
                    [agentorg_type_code],
                    [agentorg_code]
            ) WITH  FILLFACTOR = 90  ON [PRIMARY]
    GO

    CREATE  INDEX [IX_std_contract_6_cc] ON [dbo].[std_contract]([n_sales_branch_no
    ], [n_sales_code]) WITH  FILLFACTOR = 90 ON [PRIMARY]
    GO

    CREATE  INDEX [IX_std_contract_7_cc] ON [dbo].[std_contract]([master_cntr_id])
    WITH  FILLFACTOR = 90 ON [PRIMARY]
    GO
    "|formatindex.sh

    --规范索引名、删除重复索引(sql2000脚本)
    --结果存放在原文件名.new及原文件名.skip中
    --脚本运行环境:GNU awk 3.1
    --原作写于2007年9月  zhangshebao

    --用法: ./formatindex.sh sql文件名 sql文件名 ...


    awk: cmd. line:13: warning: escape sequence `\.' treated as plain `.'
    ALTER TABLE [dbo].[agent_post_reg] WITH NOCHECK ADD
            CONSTRAINT [PK_agent_post_reg] PRIMARY KEY  CLUSTERED
            (
                    [agnet_post_id]
            ) WITH  FILLFACTOR = 90  ON [PRIMARY]
    GO
    -- PK_agent_post_reg_agnet_post_id
    ALTER TABLE [dbo].[agentorg] WITH NOCHECK ADD
             PRIMARY KEY  CLUSTERED
            (
                    [agentorg_type_code],
                    [agentorg_code]
            ) WITH  FILLFACTOR = 90  ON [PRIMARY]
    GO
    -- PK_agentorg_agentorg_type_code_agentorg_code
    DROP INDEX IX_std_contract_6_cc
    GO
    CREATE  INDEX [PI_std_contract_n_sales_branch_no_n_sales_code] ON [dbo].[std_con
    tract]([n_sales_branch_no], [n_sales_code]) WITH  FILLFACTOR = 90 ON [PRIMARY]
    GO
    DROP INDEX IX_std_contract_7_cc
    GO
    CREATE  INDEX [PI_std_contract_master_cntr_id] ON [dbo].[std_contract]([master_c
    ntr_id]) WITH  FILLFACTOR = 90 ON [PRIMARY]
    GO
    -- agentorgagentorg.type.code.agentorg.code K
    -- std_contractmaster.cntr.id I
    -- std_contractn.sales.branch.no.n.sales.code I

    (脚本到楼顶取)

    [ 本帖最后由 zhangshebao 于 2007-9-1 22:09 编辑 ]

    论坛徽章:
    0
    10 [报告]
    发表于 2007-09-01 19:44 |只看该作者
    原帖由 pizigou 于 2007-9-1 09:34 发表
    我昨晚 尝试了下 还没有给你做出来 不过 有了个思路了 我再去试试。


    不好意思,没等你。不知你的思路是否与我的差不多?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP