programing

없는 경우 MySQL 추가 열

oldcodes 2023. 10. 1. 21:55
반응형

없는 경우 MySQL 추가 열

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'email_subscription' AND COLUMN_NAME = 'subscribe_all')
  THEN 
  ALTER TABLE email_subscription
  ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
  ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;

엄청난 양의 예제를 살펴봤지만 이 쿼리가 작동하지 않아 오류가 발생했습니다.

오류 1064 (42000):SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 매뉴얼에서 'IF NOT EXISTRESS(IF NOT EXISTRESS)' 근처에서 사용할 수 있는 올바른 구문을 확인하십시오.1행에서 TABLE_NAME = '열

호스트에서 프로시저를 만들거나 실행할 수 있는 권한을 부여하지 않으면 PREADE/EXECUTE를 사용하고 스키마를 쿼리하여 다른 방법을 찾은 것 같습니다.

SET @s = (SELECT IF(
    (SELECT COUNT(*)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = 'table_name'
        AND table_schema = DATABASE()
        AND column_name = 'col_name'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE table_name ADD col_name VARCHAR(100)"
));

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

질의에 대한 절차를 만들 수 있습니다.

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'email_subscription' AND 
                            COLUMN_NAME = 'subscribe_all');
    IF _count = 0 THEN
        ALTER TABLE email_subscription
            ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
            ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
    END IF;
END $$
DELIMITER ;

단일 MySQL 문에서 이를 달성할 수 있는 동등한 구문은 없습니다.

유사한 것을 얻기 위해서는, 당신은 다음 중 하나를 선택할 수 있습니다.

1) ALTER TABLE로 열을 추가하려고 시도하고 테이블에 해당 이름의 열이 이미 있는 경우 MySQL에서 오류가 발생하도록 합니다.

2) information_schema.columns 보기를 쿼리하여 해당 이름의 열이 테이블에 있는지 확인합니다.

table_schema와 table_name을(를) 반드시 확인해야 합니다.

SELECT column_name
  FROM information_schema.columns 
 WHERE table_schema = 'foo'
   AND table_name   = 'email_subscription'
   AND column_name  = 'subscribe_all'

이를 바탕으로 ALTER TABLE을 실행할지 여부를 결정합니다.

MySQL에서 MS SQL Server 구문을 사용하고 있습니다.

또한 데이터베이스 이름에 대한 조건을 추가하여 열 존재 여부를 확인합니다.

시도해 보기:

DELIMITER $$
CREATE PROCEDURE sp_AlterTable()
BEGIN
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                   WHERE TABLE_SCHEMA = 'dbName' AND 
                         TABLE_NAME = 'email_subscription' AND 
                         COLUMN_NAME = 'subscribe_all') THEN 
       ALTER TABLE email_subscription
          ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
          ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL;
    END IF; 
END $$
DELIMITER ;
SET @s = (SELECT IF(
    (SELECT COUNT(column_name)
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE table_name = 'oc_bitcoin_wallets_receive'
          AND table_schema = 'k_opencart2'
          AND column_name = 'test3'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE `oc_bitcoin_wallets_receive` ADD COLUMN `test3` INT NOT NULL AFTER `test2`;"
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

편집을 위한 값 : oc_bitcoin_wallets_receive - 테이블명, k_opencart2 - 데이터베이스명, test3 - new column의 이름, oc_bitcoin_wallets_receive - second location test3 - second location column, test2 - new column 앞 컬럼의 이름

언급URL : https://stackoverflow.com/questions/14381895/mysql-add-column-if-not-exist

반응형