2012-07-06 2 views
1

업데이트 쿼리를 실행하고 싶습니다.MySql - 테이블이있는 경우 일부 행만 업데이트 - 오류가 발생하지 않음

쿼리가 여러 데이터베이스에 대해 실행됩니다. 모든 데이터베이스에 테이블이있는 것은 아닙니다.

테이블이없는 경우 업데이트를 시도하지 않으려합니다. 오류가 발생하지 않도록하고 싶습니다. 업데이트를 무시하고 싶습니다.

아이디어가 있으십니까?

EDIT : 명확한 내용 - 쿼리는 자동화 된 배포에서 실행되며 사용자 상호 작용은 불가능합니다.

EDIT2 : 업데이트를 실행할지 말지를 결정하는 논리는 MySql 쿼리 자체에 있어야합니다. 이것은 명령 프롬프트 나 배치 또는 관리 코드를 통해 실행되지 않습니다.

+0

당신은 지금까지 어떤 시도를했고 어떤 오류가 있었습니까? 이 허용 된 대답은 테이블이 존재하지 않는 경우 업데이트 진술에서 오류가 발생하지 않도록 제안하는 것 같습니다. http://stackoverflow.com/questions/1833687/sql-to-update-a-table-only-if-that- table-exists-the-database – anotherdave

+1

테이블이 있는지 여부를 확인할 수 있습니다.하지만 그럴 수는 없습니다. "IF MyResult = 1 THEN Update myTable" – PeteGO

+0

게시하기 전에 내가 지적한 링크를 보았습니다. 그러나 "손상이 없습니다"는 내가 후한 것이 아닙니다. 여전히 오류가 발생합니다. – PeteGO

답변

2

네이티브 MySQL의에서이 작업을 수행하려면 실제 쿼리를 실행하면

table_exists_query = Select count(*) from INFORMATION_SCHEMA.tables where table_name='xxxx'; 

, 당신이 사용할 수 저장 프로 시저.

이것은 일회성 관리 유형 기능에 적합하며 응용 프로그램의 일부로이 기능을 사용하지 않을 것입니다. (이것이 다시 응용 프로그램의 일부인 경우, UPDATE가 수행되는지 여부를 제어하거나 테이블이 없으면 예외를 catch하고 처리하기위한 조건부 논리를 갖게됩니다.)

다음은 예제입니다. CONTINUE HANDLER을 사용하여 오류 1146 (표가 존재하지 않음)을 catch하고이를 삼킨 다음 호출자에게 오류가 반환되지 않는 저장 프로 시저


DELIMITER // 
DROP PROCEDURE IF EXISTS `table_doesnt_exist_handler`// 
CREATE DEFINER=`root`@`%` PROCEDURE `table_doesnt_exist_handler`() 
BEGIN 
    DECLARE table_doesnt_exist BOOLEAN; 
    DECLARE CONTINUE HANDLER FOR 1146 SET table_doesnt_exist = TRUE; 

    UPDATE table_doesnt_exist SET foo = 1 WHERE foo = 1; 

END// 
CALL `table_doesnt_exist_handler`()// 
DROP PROCEDURE IF EXISTS `table_doesnt_exist_handler`// 
DELIMITER ; 

또 다른 옵션은 테이블의 존재 여부를 테스트하고, 조건부 문을 실행하는 것입니다. 네이티브 MySQL에서는, 다시 말하면, 스토어드 프로 시저 내에서이 작업을 수행해야합니다.

DELIMITER // 
DROP PROCEDURE IF EXISTS `table_doesnt_exist_approach_2`// 
CREATE DEFINER=`root`@`%` PROCEDURE `table_doesnt_exist_approach_2`() 
BEGIN 
    SELECT @table_exists := COUNT(1) AS table_exists 
    FROM information_schema.tables 
    WHERE table_schema = DATABASE() 
    AND table_name = 'table_doesnt_exist'; 
    IF @table_exists > 0 THEN 
    UPDATE table_doesnt_exist SET foo = 2 WHERE foo = 1; 
    END IF; 
END// 

CALL `table_doesnt_exist_approach_2`()// 
DROP PROCEDURE IF EXISTS `table_doesnt_exist_approach_2`// 
DELIMITER ; 

내 취향은 CONTINUE HANDLER로 이동하는 것입니다.

+1

이것이 유일한 방법이라고 생각합니다. 더 쉬운 것이있을 것이다라고하는 생각 그러나 명백하게 없다! 감사. – PeteGO

+0

설명 감사합니다 –

+0

@ankit : SQL 문을 조건부로 실행하기위한 조건부 'IF'테스트는 저장된 프로그램 (저장 프로 시저, 함수 또는 트리거) 외부의 원시 MySQL에서 사용할 수 없습니다. 'CONTINUE HANDLER'는 MySQL이 예외를 포착하고 처리하는 방식입니다. – spencer7593

0

테이블 이름에 대한 설명을 수행 할 수 있으며 결과가 비어 있으면 업데이트를 실행하지 마십시오. 짧은 스크립트에서이 작업을 수행 할 수 있지만 사용 언어가 확실하지 않습니다. 당신은 아마 당신이 엄격하게 여기 DB를보고 있다면 저장 프로 시저에서 그것을 관리 할 수 ​​있습니다.

0

먼저 해당 쿼리의 테이블이 있는지 확인한 다음 실제 쿼리를 실행할 수 있습니다.

예 : (run_query (table_exists_query) == 1) 이 (MySQL의 스크립트처럼)

+0

내가 말할 수있는 한 run_query 또는 IF를 사용할 수 없습니다. 내 질문을 업데이트했습니다. – PeteGO

관련 문제