programing

테이블이 있는 경우 작업 수행

closeapi 2023. 9. 3. 16:18
반응형

테이블이 있는 경우 작업 수행

저는 그 곳에 있는 테이블이 무엇인지 알아보고 있습니다.OOK그리고 만약 그렇다면, 그것에 뭔가를 하라.이것은 지금까지 제가 가지고 있는 것인데, 도움이 되는 사람과 함께 작동하지 않습니다.ERROR 1064 […] syntax error메시지:

IF show tables like 'OOK' THEN
    DELETE FROM OOK WHERE Id = 'Development';
    INSERT INTO OOK VALUES ( 'Development', 'Localhost' );
END IF

이는 일부 레거시 코드를 지원하기 위한 것이며 문제에 대한 최선의 해결책이 아닐 수 있습니다.하지만, 그것은 제가 필요로 하는 것을 고칠 것입니다.

답변에 구문 오류가 많이 발생하므로 다음과 같은 버전이 있습니다.Server version: 5.5.60-MariaDB MariaDB Server.

정보 스키마에 액세스하여 테이블의 존재 여부를 확인할 수 있습니다.또한 테이블 이름이 없는 경우 동적 SQL을 사용해야 합니다.

다음과 같은 방법을 사용해 보십시오.

IF EXISTS (SELECT 1
           FROM information_schema.tables 
           WHERE table_schema = 'your_database_name' 
           AND table_name = 'OOK') THEN 

  SET @s1 = 'DELETE FROM your_database_name.OOK WHERE Id = ?';
  SET @a = 'Development';
  PREPARE stmt1 FROM @s1;
  EXECUTE stmt1 USING @a;
  DEALLOCATE PREPARE stmt1;

  SET @s2 = 'INSERT INTO your_database_name.OOK VALUES (?, ?)';
  SET @b = 'Development';
  SET @c = 'Localhost';
  PREPARE stmt2 FROM @s2;
  EXECUTE stmt1 USING @b, @c;
  DEALLOCATE PREPARE stmt2;

END IF

나는 아래의 절차와 기능을 db의 테이블 복제 과정에서 사용합니다.

사용.

CALL do_something('mydb', 'OOK', 'Development', 'Development', 'Localhost');

실행

DELIMITER $$;
CREATE PROCEDURE do_something(
  IN dbName VARCHAR(255),
  IN tableName VARCHAR(255),
  IN id VARCHAR(255),
  IN value1 VARCHAR(255),
  IN value2 VARCHAR(255)
)
  BEGIN
    IF ( fn_table_exists(dbName, tableName) )
      THEN
        CALL statement(CONCAT(
          'DELETE FROM ', tableName, ' WHERE Id = "', id, '"'));
        CALL statement(CONCAT(
          'INSERT INTO ', tableName, ' VALUES ( "', value1, '", "', value2, '" )'));
      ELSE
        SELECT CONCAT(
          'ERROR: Table "', tableName, '" does not exist in the schema "', dbName, '".'
        ) AS ErrorMessage;
      END IF;
END$$
DELIMITER ;

DELIMITER $$;
CREATE PROCEDURE statement(IN dynamic_statement TEXT)
  BEGIN
      SET @dynamic_statement := dynamic_statement;
      PREPARE prepared_statement FROM @dynamic_statement;
      EXECUTE prepared_statement;
      DEALLOCATE PREPARE prepared_statement;
  END$$
DELIMITER ;

DELIMITER $$;
CREATE FUNCTION fn_table_exists(dbName VARCHAR(255), tableName VARCHAR(255))
  RETURNS TINYINT(1)
  BEGIN
    DECLARE totalTablesCount INT DEFAULT (
      SELECT COUNT(*)
      FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = dbName COLLATE utf8_general_ci)
        AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci)
    );
    RETURN IF(
      totalTablesCount > 0,
      TRUE,
      FALSE
    );
END$$
DELIMITER ;

언급URL : https://stackoverflow.com/questions/52971999/do-something-if-a-table-exists

반응형