日期:2014-05-16  浏览次数:20536 次

修改informix数据库表的主键
修改informix数据库表的主键,需要首先删除主键,再新建。
第一步:
查出该主键的约束的名字,查约束名SQL语句如下(TabName为表名):
SELECT constrname FROM sysconstraints
WHERE tabid = (SELECT tabid FROM systables
WHERE tabname = ‘TabName’) and constrtype ='P' ;

{
constrtype ='P' 是主键约束,还有
C 检查(Check)
R 引用(外键)(Reference,Foreign Key)
U 唯一 *** (Unique)
N 非空(Not Null)
}

第二步:
删除主键(TabName为表名,u144_58为上一步查出的约束名),SQL语句如下:

alter table TabName drop constraint u144_58;

第三步:
新建主键(主键为policyno,classcode,loandate),SQL语句如下:
>>
ALTER TABLE TabName
ADD CONSTRAINT PRIMARY KEY (policyno,classcode,loandate)
CONSTRAINT u144_58;

{u144_58约束名可自定,必需唯一}

由于整个修改主键过程无法纯用SQL脚本完成,特写了一个SHELL脚本。

修改数据库主键 SHELL 脚本,需要informix的dbaccess支持:
#!/bin/sh
#################################################
#功能: informix 修改数据库主键
#################################################

chg_primary_key()
{
    if [ $# -ne 2 ];then
        echo "<ERROR> Uargs: chg_primary_key tableName primaryKey \n[$*]"
        exit 1
    fi 

    _tableName="$1"
    _primaryKey="$2"

    alias dbaccess='dbaccess'

    #查出老的主键约束名
    _constrName=`dbaccess remotedb 2>> tmp.txt << EOF | xargs | cut -d ' ' -f2
    select constrname from sysconstraints where constrtype='P'
    and tabid= ( select tabid from systables where tabname = '$_tableName' ) ;
EOF `

    if [ -z "$_constrName" ] || [ "$_constrName" = "constrname" ];then
        echo "<ERROR>主键名查出为空!"
        exit 1
    fi 

    #修改主键
    dbaccess remotedb << EOF
    alter table $_tableName drop constraint $_constrName;
    alter table $_tableName add constraint
    primary key ($_primaryKey) constraint $_constrName;
EOF

}

#debitrec修改主键为(policyno,classcode,loandate)
chg_primary_key debitrec policyno,classcode,loandate
#borrapp修改主键为(id,policyno,classcode,bdate)
chg_primary_key borrapp id,policyno,classcode,bdate
#quittask修改主键为(taskid,policyno,classcode)
chg_primary_key quittask taskid,policyno,classcode
来自: http://hi.baidu.com/yanweinet/blog/item/42deec58fc3743d89c8204b1.html