일부 데이터베이스 정리를 수행 중이며 여러 열에 빈 문자열과 NULL 값을 모두 포함하는 열이 많이 있음을 확인했습니다.전체 데이터베이스에 대해 빈 문자열을 NULL로 업데이트합니다.
NULL을 허용하지 않는 것을 제외하고 데이터베이스에서 각 테이블의 각 열에 대해 빈 문자열을 NULL로 업데이트하는 SQL 문을 작성할 수 있습니까?
나는 information_schema.COLUMNS
테이블을보고 이것이 시작할 곳이라고 생각했습니다.
일부 데이터베이스 정리를 수행 중이며 여러 열에 빈 문자열과 NULL 값을 모두 포함하는 열이 많이 있음을 확인했습니다.전체 데이터베이스에 대해 빈 문자열을 NULL로 업데이트합니다.
NULL을 허용하지 않는 것을 제외하고 데이터베이스에서 각 테이블의 각 열에 대해 빈 문자열을 NULL로 업데이트하는 SQL 문을 작성할 수 있습니까?
나는 information_schema.COLUMNS
테이블을보고 이것이 시작할 곳이라고 생각했습니다.
: 대기 시간을 보내고 준비합니다. 나는 다음에 스크립팅 언어를 사용하는 것을 확실히 볼 것이다.
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();
하나의 간단한 SQL 문으로는이 작업을 수행 할 수 없습니다.
하지만 각 열에 대해 하나의 명령문을 사용하여 수행 할 수 있습니다.
UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(COLUMN) = 0
또는, 당신은 또한 공백이있는 항목을 null로 할 경우 :
UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(TRIM(COLUMN)) = 0
나는 MySQL을 내 그러나 확실하게 당신의 선택의 스크립트 언어로 가능하다고 생각하지 않습니다. 모든 테이블
DESC TABLE
, SHOW CREATE TABLE
또는 SELECT * FROM information_schema.COLUMNS
와 함께, 당신은 오히려 위해 다음SHOW TABLES
에게 얻어서
기본 구문을 사용해 주셔서 감사합니다. 모든 열에 대해이 작업을 수행하지 않는 방법이 있기를 희망했습니다. – hafichuk