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);
在这种情况下,一定要先创建索引,再创建外键。如果我们先创建外键的话,相同的索引名字就会被占用,这样我们创建索引的时候就会提示索引名字存在,但系统主动创建的索引又不符合我们组合索引的要求,只能是删除重建。
浙公网安备 33010602011771号