MySQL索引,外键的使用总结

先上代码:

BEGIN
    #Routine body goes here...
    DECLARE  CurrentDatabase VARCHAR(100);
    DECLARE Constraint_Name VARCHAR(100);
    DECLARE Table_Name VARCHAR(100);
    DECLARE countNum INT;

    SELECT DATABASE() INTO CurrentDatabase;

    #PARTY
    IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND index_name = 'PHONE1_IDX') THEN  
        ALTER TABLE party DROP INDEX PHONE1_IDX;
        ALTER TABLE party ADD INDEX PHONE1_IDX (PHONE1);
    ELSE
        ALTER TABLE party ADD INDEX PHONE1_IDX (PHONE1);
    END IF;


IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND index_name = 'National_Party') THEN  
    SELECT COUNT(*) FROM (SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = CurrentDatabase AND REFERENCED_TABLE_NAME IS NOT NULL) TT WHERE TT.TABLE_NAME = 'national_title' AND TT.CONSTRAINT_NAME = 'National_Party' INTO countNum;
        SELECT countNum;
IF(countNum>0) THEN    
        ALTER TABLE national_title DROP FOREIGN KEY National_Party;
    END IF;

    ALTER TABLE national_title DROP INDEX National_Party;
    ALTER TABLE national_title ADD INDEX National_Party (PARTY_ID,CREATED_STAMP);
        ALTER TABLE national_title ADD CONSTRAINT National_Party FOREIGN KEY (PARTY_ID) REFERENCES party (PARTY_ID);
ELSE
    ALTER TABLE national_title ADD INDEX National_Party (PARTY_ID,CREATED_STAMP);
  ALTER TABLE national_title ADD CONSTRAINT National_Party FOREIGN KEY (PARTY_ID) REFERENCES party (PARTY_ID);
END IF;


END

以上是一个存储过程,最近尽搞这个了。这个存储过程是对索引,外键进行操作的。

首先查找出所以是否存在,SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND index_name = 'PHONE1_IDX',这样的语句查找可能系统里会有两个索引名字一样的,所以在定制index_name的时候,尽量避免名称重复。可能会有人说为什么不使用

SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND index_name = 'PHONE1_IDX' AND table_name = 'party';这样的语句试过,如果是在普通的查询语句中视没有问题的,但在存储过程中会查不到值,具体原因我还没搞清楚。

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = CurrentDatabase AND REFERENCED_TABLE_NAME IS NOT NULL,这是查询系统中所涉及到的外键,同样如果我用

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = CurrentDatabase AND REFERENCED_TABLE_NAME IS NOT NULL  AND CONSTRAINT_NAME = 'National_Party'(或者TABLE_NAME='national_title');

这样也是查不到数据的,可以看到我在查询外键的时候在外边有嵌套查询一下个数,实在被逼无奈一时又想不出具体好的方法,只能是通过判断个数来判定是否有外键。
添加外键的时候数据库会自动,添加一个与外键同名的索引,所涉及到的字段一样,所以要删除该索引的时候一定要判断一下,有没有同名的外键。
在添加索引,并且是组合索引的时候,我们可以利用外键的名字。
例:ALTER TABLE national_title ADD INDEX National_Party (PARTY_ID,CREATED_STAMP);   ALTER TABLE national_title ADD CONSTRAINT National_Party FOREIGN KEY (PARTY_ID) REFERENCES party (PARTY_ID);
在这种情况下,一定要先创建索引,再创建外键。如果我们先创建外键的话,相同的索引名字就会被占用,这样我们创建索引的时候就会提示索引名字存在,但系统主动创建的索引又不符合我们组合索引的要求,只能是删除重建。

posted on 2016-04-19 21:58  会飞的小强  阅读(1250)  评论(0)    收藏  举报

导航