我們有100多個數據庫在同一臺服務器上具有相同的模式。我需要在所有數據庫上運行相同的select語句並返回結果。我已經看過直通幾個職位對改變許多DBS,並嘗試這樣的:使用MySQL在多個數據庫上運行相同的查詢
SELECT CONCAT
('SELECT * FROM ', a.table_schema, '.tableIwant
GROUP BY CONCAT(emp_id, "-", other_id)
HAVING count(CONCAT(emp_id, "-", other_id)) >1')
FROM information_schema.tables a
WHERE a.table_schema LIKE 'table_prefix_%'
GROUP BY a.table_schema;
但是,所有這些返回的查詢列表。 我知道我可以用PHP做到這一點 - 用一個查詢構建所有dbs的列表,然後在結果集上構建一個WHILE循環等等。但是我想從MySQL做到這一點,有沒有辦法?
UPDATE:
感謝@KayakJim我試圖創建一個存儲過程來解決這個問題:
DELIMITER //
CREATE PROCEDURE checkDuplicates()
BEGIN
DECLARE bDone INT;
DECLARE dbname VARCHAR(20);
DECLARE count1, count2 INT;
DECLARE curs CURSOR FOR SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE table_schema like 'table_%' GROUP BY table_schema;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
CREATE TEMPORARY TABLE IF NOT EXISTS db1.tblResults (
name VARCHAR(20),
countDupes INT,
countDupesAll INT
) ENGINE = MEMORY
;
OPEN curs;
SET bDone = 0;
REPEAT
FETCH curs INTO dbname;
SELECT SQL_CALC_FOUND_ROWS * FROM dbname.table
GROUP BY CONCAT(emp_id, "-", other_id)
HAVING count(CONCAT(emp_id, "-", other_id)) >1;
SET count1 = FOUND_ROWS();
SELECT SQL_CALC_FOUND_ROWS * FROM dbname.table
GROUP BY CONCAT(emp_id, "-", other_id, "-", param)
HAVING count(CONCAT(emp_id, "-", other_id, "-", param)) >1;
SET count2 = FOUND_ROWS();
UNTIL bDone END REPEAT;
CLOSE curs;
SELECT * FROM db1.tblResults;
END;
//
CALL checkDuplicates();
現在的問題是,當我執行,它會返回錯誤1049:未知數據庫'INFORMATION_SCHEMA'。當我使用該查詢並單獨運行時,我不會收到任何錯誤,並返回匹配WHERE子句的數據庫列表。
如果將其更改爲'information_schema'(即小寫字母並用反引號括起)會怎麼樣? –