[mysql] MySQL, SQL이있는 테이블에 열이 있는지 확인하십시오.

MySQL의 특정 테이블에 특정 열이 있는지 확인하고 그렇지 않은 경우 확인하는 쿼리를 작성하려고합니다. 그렇지 않으면 아무것도하지 마십시오. 이것은 모든 엔터프라이즈 급 데이터베이스에서 실제로 쉬운 절차이지만 MySQL은 예외 인 것 같습니다.

나는 같은 것을 생각했다

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
           WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update') 
BEGIN 
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;

작동하지만 잘못 실패합니다. 방법이 있습니까?



답변

이것은 나를 위해 잘 작동합니다.

SHOW COLUMNS FROM `table` LIKE 'fieldname';

PHP를 사용하면 다음과 같습니다.

$result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'");
$exists = (mysql_num_rows($result))?TRUE:FALSE;


답변

juli

SQL 예제에 감사드립니다. 쿼리를 시도했는데 제대로 작동하려면 약간의 변경이 필요하다고 생각합니다.

SELECT * 
FROM information_schema.COLUMNS 
WHERE 
    TABLE_SCHEMA = 'db_name' 
AND TABLE_NAME = 'table_name' 
AND COLUMN_NAME = 'column_name'

그것은 나를 위해 일했다.

감사!


답변

@Mchl이 묘사 한 구체적인 예를 찾고있는 사람을 돕기 위해 다음과 같은 것을 시도하십시오.

SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'

false를 반환하면 (결과 없음) 열이 존재하지 않는 것입니다.


답변

information_schema 데이터베이스없이 일반 PHP를 사용하는 또 다른 방법은 다음과 같습니다.

$chkcol = mysql_query("SELECT * FROM `my_table_name` LIMIT 1");
$mycol = mysql_fetch_array($chkcol);
if(!isset($mycol['my_new_column']))
  mysql_query("ALTER TABLE `my_table_name` ADD `my_new_column` BOOL NOT NULL DEFAULT '0'");


답변

위의 @lain 주석에서 시작 하여이 저장 프로 시저를 던졌습니다. 몇 번 이상 호출 해야하는 경우 (그리고 PHP가 필요하지 않음) 좋습니다.

delimiter //
-- ------------------------------------------------------------
-- Use the inforamtion_schema to tell if a field exists.
-- Optional param dbName, defaults to current database
-- ------------------------------------------------------------
CREATE PROCEDURE fieldExists (
OUT _exists BOOLEAN,      -- return value
IN tableName CHAR(255),   -- name of table to look for
IN columnName CHAR(255),  -- name of column to look for
IN dbName CHAR(255)       -- optional specific db
) BEGIN
-- try to lookup db if none provided
SET @_dbName := IF(dbName IS NULL, database(), dbName);

IF CHAR_LENGTH(@_dbName) = 0
THEN -- no specific or current db to check against
  SELECT FALSE INTO _exists;
ELSE -- we have a db to work with
  SELECT IF(count(*) > 0, TRUE, FALSE) INTO _exists
  FROM information_schema.COLUMNS c
  WHERE
  c.TABLE_SCHEMA    = @_dbName
  AND c.TABLE_NAME  = tableName
  AND c.COLUMN_NAME = columnName;
END IF;
END //
delimiter ;

협력 fieldExists

mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_option', NULL) //
Query OK, 0 rows affected (0.01 sec)

mysql> select @_exists //
+----------+
| @_exists |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_options', 'etrophies') //
Query OK, 0 rows affected (0.01 sec)

mysql> select @_exists //
+----------+
| @_exists |
+----------+
|        1 |
+----------+


답변

정보 스키마에서 column_name 만 선택하고이 쿼리 결과를 변수에 넣습니다. 그런 다음 변수를 테스트하여 테이블을 변경해야하는지 여부를 결정하십시오.

추신 COLUMNS 테이블에 대해 TABLE_SCHEMA를 지정하지 마십시오.


답변

이 간단한 스크립트를 사용하고 있습니다 :

mysql_query("select $column from $table") or mysql_query("alter table $table add $column varchar (20)");

데이터베이스에 이미 연결되어 있으면 작동합니다.