MySQL 참조 매뉴얼은이를 수행하는 방법에 대한 명확한 예를 제공하지 않습니다.
국가를 추가해야하는 ENUM 유형의 국가 이름 열이 있습니다. 이것을 달성하기위한 올바른 MySQL 구문은 무엇입니까?
내 시도는 다음과 같습니다.
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
내가 얻는 오류는 다음과 같습니다. ERROR 1265 (01000): Data truncated for column 'country' at row 1.
country
열은 위의 문에서 ENUM 타입의 열입니다.
테이블 출력 생성 방법 :
mysql> SHOW CREATE TABLE carmake;
+---------+---------------------------------------------------------------------+
| Table | Create Table
+---------+---------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`carmake_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` tinytext,
`country` enum('Japan','USA','England','Australia','Germany','France','Italy','Spain','Czech Republic','China','South Korea','India') DEFAULT NULL,
PRIMARY KEY (`carmake_id`),
KEY `name` (`name`(3))
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
carmake 출력 에서 고유 한 국가를 선택하십시오 .
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
답변
ALTER TABLE
`table_name`
MODIFY COLUMN
`column_name2` enum(
'existing_value1',
'existing_value2',
'new_value1',
'new_value2'
)
NOT NULL AFTER `column_name1`;
답변
귀하의 코드가 저에게 효과적입니다. 내 테스트 사례는 다음과 같습니다.
mysql> CREATE TABLE carmake (country ENUM('Canada', 'United States'));
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE carmake;
+---------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-------------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`country` enum('Canada','United States') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Query OK, 0 rows affected (0.53 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE carmake;
+---------+--------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`country` enum('Sweden','Malaysia') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
어떤 오류가 나타 납니까?
다음과 같이 작동합니다.
ALTER TABLE carmake MODIFY COLUMN country ENUM('Sweden','Malaysia');
실제로 열거 형 열이 아닌 국가 테이블을 권장합니다. 다소 크고 어색한 열거 형을 만드는 수백 개의 국가가있을 수 있습니다.
편집 : 이제 오류 메시지가 표시됩니다.
ERROR 1265 (01000): Data truncated for column 'country' at row 1.
국가 열에에 표시되지 않은 값이 있다고 생각합니다 ENUM
. 다음 명령의 결과는 무엇입니까?
SELECT DISTINCT country FROM carmake;
다른 편집 : 다음 명령의 출력은 무엇입니까?
SHOW VARIABLES LIKE 'sql_mode';
그것은인가 STRICT_TRANS_TABLES
또는 STRICT_ALL_TABLES
? 이 상황에서 MySQL이 알려주는 일반적인 경고보다는 오류가 발생할 수 있습니다.
또 다른 편집 : 이제 테이블에 new에없는 값이 있음을 알았습니다 ENUM
. 새로운 ENUM
정의는 'Sweden'
and 만 허용 'Malaysia'
합니다. 표는있다 'USA'
, 'India'
그리고 몇몇 다른 사람.
마지막 편집 (MAYBE) :이 작업을 수행하려는 것 같습니다.
ALTER TABLE carmake CHANGE country country ENUM('Italy', 'Germany', 'England', 'USA', 'France', 'South Korea', 'Australia', 'Spain', 'Czech Republic', 'Sweden', 'Malaysia') DEFAULT NULL;
답변
토론 우리가 앞뒤로 꽤 갔다 나는이 아삽과 함께했다 따를 불분명 할 수있다.
나는 미래에 비슷한 상황에 처할 수있는 다른 사람들을 위해 우리의 담론의 결말을 분명히 밝힐 수 있다고 생각했습니다.
ENUM
유형 컬럼은 조작하기가 매우 어려운 짐승입니다. ENUM의 기존 국가 세트에 두 국가 (말레이시아 및 스웨덴)를 추가하고 싶었습니다.
MySQL 5.1 (내가 실행중인 것)은 내가 원하는 것 외에도 기존 세트를 재정 의하여 ENUM 만 업데이트 할 수있는 것 같습니다.
이것은 작동하지 않았다 :
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;
그 이유는 MySQL의 문이 또 다른 항목을 포함하여 기존 ENUM를 교체 한 것이 었습니다 'Malaysia'
및 'Sweden'
단지. MySQL은 때문에 오류를 던졌다 carmake
테이블에 이미 한 값이 좋아 'England'
하고 'USA'
있는 새의 일부가 아닌 ENUM
‘의 정의.
놀랍게도 다음은 작동하지 않았습니다.
ALTER TABLE carmake CHANGE country country ENUM('Australia','England','USA'...'Sweden','Malaysia') DEFAULT NULL;
ENUM
새로운 멤버를 추가하면서 기존 요소의 순서조차도 유지해야 한다는 것이 밝혀졌습니다 . 기존 그래서 만약 ENUM
같은 모양의 무언가가 ENUM('England','USA')
, 다음 내 새가 ENUM
있다으로 정의 할 수 있습니다 ENUM('England','USA','Sweden','Malaysia')
하지 ENUM('USA','England','Sweden','Malaysia')
. 이 문제는 기존 테이블에 'USA'
또는 'England'
값 을 사용하는 레코드가있는 경우에만 나타납니다 .
하단 라인 :
ENUM
정의 된 멤버 집합이 변경되지 않을 경우 에만 s를 사용 하십시오. 그렇지 않으면 조회 테이블을 업데이트하고 수정하기가 훨씬 쉽습니다.
답변
MYSQL 서버 버전 : 5.0.27 나는 이것을 시도하고 당신의 버전에서 나를 위해 잘 작동했습니다.
ALTER TABLE carmake
MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');
답변
참고 : 유용한 시뮬레이션 도구-phpMyAdmin with Wampserver 3.0.6-Preview SQL : ‘Preview SQL’을 사용하여 ENUM 변경으로 열을 저장하기 전에 생성되는 SQL 코드를 봅니다. SQL 미리보기
위의 ENUM에 ‘Ford’, ‘Toyota’를 입력했지만 구문 오류가 발생하는 구문 ENUM (0)이 표시됩니다. 쿼리 오류 1064 #
그런 다음 SQL을 복사하여 붙여넣고 변경하고 SQL을 통해 실행하여 긍정적 인 결과를 얻습니다.
이것은 내가 자주 사용하는 빠른 수정이며 변경해야하는 기존 ENUM 값에도 사용할 수 있습니다. 이것이 유용 할 것이라고 생각했습니다.
답변
다른 방법이 있습니다 …
“firmas”테이블의 “rtipo”열에 대한 열거 정의에 “others”를 추가합니다.
set @new_enum = 'others';
set @table_name = 'firmas';
set @column_name = 'rtipo';
select column_type into @tmp from information_schema.columns
where table_name = @table_name and column_name=@column_name;
set @tmp = insert(@tmp, instr(@tmp,')'), 0, concat(',\'', @new_enum, '\'') );
set @tmp = concat('alter table ', @table_name, ' modify ', @column_name, ' ', @tmp);
prepare stmt from @tmp;
execute stmt;
deallocate prepare stmt;
답변
당신이 믿는다면 가능합니다. 헤헤 이 코드를 사용해보십시오.
public function add_new_enum($new_value)
{
$table="product";
$column="category";
$row = $this->db->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ? AND COLUMN_NAME = ?", array($table, $column))->row_array();
$old_category = array();
$new_category="";
foreach (explode(',', str_replace("'", '', substr($row['COLUMN_TYPE'], 5, (strlen($row['COLUMN_TYPE']) - 6)))) as $val)
{
//getting the old category first
$old_category[$val] = $val;
$new_category.="'".$old_category[$val]."'".",";
}
//after the end of foreach, add the $new_value to $new_category
$new_category.="'".$new_value."'";
//Then alter the table column with the new enum
$this->db->query("ALTER TABLE product CHANGE category category ENUM($new_category)");
}