2011-12-02 3 views
2

일부 데이터베이스 정리를 수행 중이며 여러 열에 빈 문자열과 NULL 값을 모두 포함하는 열이 많이 있음을 확인했습니다.전체 데이터베이스에 대해 빈 문자열을 NULL로 업데이트합니다.

NULL을 허용하지 않는 것을 제외하고 데이터베이스에서 각 테이블의 각 열에 대해 빈 문자열을 NULL로 업데이트하는 SQL 문을 작성할 수 있습니까?

나는 information_schema.COLUMNS 테이블을보고 이것이 시작할 곳이라고 생각했습니다.

답변

0

: 대기 시간을 보내고 준비합니다. 나는 다음에 스크립팅 언어를 사용하는 것을 확실히 볼 것이다.

DROP PROCEDURE IF EXISTS settonull; 

DELIMITER // 

CREATE PROCEDURE settonull() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE _tablename VARCHAR(255); 
    DECLARE _columnname VARCHAR(255); 
    DECLARE cur1 CURSOR FOR SELECT 
          CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS table_name, 
          COLUMN_NAME AS column_name 
          FROM information_schema.COLUMNS 
          WHERE IS_NULLABLE = 'YES' 
          AND TABLE_SCHEMA IN ('table1', 'table2', 'table3'); 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur1; 

    read_loop: LOOP 
    FETCH cur1 INTO _tablename, _columnname; 

    IF done THEN 
     LEAVE read_loop; 
    END IF; 

    SET @s = CONCAT('UPDATE ', _tablename, ' SET ', _columnname, ' = NULL WHERE LENGTH(TRIM(', _columnname, ')) = 0'); 
    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    END LOOP; 

    CLOSE cur1; 
END// 

DELIMITER ; 

CALL settonull(); 
5

하나의 간단한 SQL 문으로는이 작업을 수행 할 수 없습니다.

하지만 각 열에 대해 하나의 명령문을 사용하여 수행 할 수 있습니다.

UPDATE TABLE SET COLUMN = NULL 
WHERE LENGTH(COLUMN) = 0 

또는, 당신은 또한 공백이있는 항목을 null로 할 경우 :

UPDATE TABLE SET COLUMN = NULL 
WHERE LENGTH(TRIM(COLUMN)) = 0 
+0

기본 구문을 사용해 주셔서 감사합니다. 모든 열에 대해이 작업을 수행하지 않는 방법이 있기를 희망했습니다. – hafichuk

1

나는 MySQL을 내 그러나 확실하게 당신의 선택의 스크립트 언어로 가능하다고 생각하지 않습니다. 모든 테이블

  • 그런 다음 각 테이블의 다른 열을 얻고 마녀들 중 하나 DESC TABLE, SHOW CREATE TABLE 또는 SELECT * FROM information_schema.COLUMNS와 함께, 당신은 오히려 위해 다음
  • 을 분석 한을, 널 (null) 허용 알아 SHOW TABLES에게 얻어서

    1. 시작 null을 "null"로 변경하는 정상적인 갱신을 실행할 수있는 각 열.

  • 내가 저장 프로 시저를 사용하여이 작업을 수행하는 방법을 알아 냈

    관련 문제