我有一个问题:
SELECT
'{\"nombre\":\"'||c.column_name||'\",\"type\":\"'|| c.data_type
||'\",\"is_nullable\":\"'|| c.is_nullable||'\",\"is_pk\":\"'|| CASE WHEN constraint_type = 'PRIMARY KEY' THEN 'SI' ELSE 'NO' END
||'\",\"max_length\":\"'||COALESCE(c.character_maximum_length::VARCHAR,'')||'\",\"FK_schema\":\"'||COALESCE(ccu.table_schema,'')||'\",\"FK_tabla\":\"'||
COALESCE(ccu.table_name,'')||'\",\"FK_columna\":\"'||COALESCE(ccu.column_name,'')||
'\"}' as id, c.column_name
FROM information_schema.columns AS c
LEFT JOIN information_schema.key_column_usage i ON I.table_name=c.table_name AND I.table_schema=c.table_schema AND c.column_name = I.column_name
LEFT JOIN information_schema.table_constraints tc ON TC.constraint_name = I.CONSTRAINT_NAME AND constraint_type IN ('FOREIGN KEY','PRIMARY KEY')
LEFT JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
AND constraint_type IN ('FOREIGN KEY')
WHERE c.table_schema = '".$_POST['schema']."' AND c.table_name='".$_POST['tabla']."'
AND NOT EXISTS (
SELECT q.column_name FROM information_schema.constraint_column_usage q
inner join information_schema.table_constraints USING(constraint_name )
WHERE c.table_schema = q.table_schema AND q.table_name=c.table_name AND q.column_name = c.column_name
AND tc.constraint_name > q.constraint_name AND TC.constraint_type <> 'PRIMARY KEY')
ORDER BY c.ordinal_position;
这段代码是可行的,但在一个包含97个模式的数据库中运行需要整整一分钟。
我该如何解决这个问题呢?
如果去掉以下这行代码:
LEFT JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
AND constraint_type = 'FOREIGN KEY'
那么运行时间将少于1秒钟。