2013-01-07 12 views
5

Kiedy wykonać to oświadczenie:Modyfikowanie kolumna enum powiedzie, ale wartość nie jest ważna

ALTER TABLE person MODIFY COLUMN subcommittee 
    ENUM('Arts','Bus','HC','IA','Pol','ST','Floater','Student') NULL DEFAULT NULL; 

odpowiedź jest

2801 row(s) affected Records: 2801 Duplicates: 0 Warnings: 0 

ale wtedy to stwierdzenie:

update person set subcommittee = 'Student' where person_pk = 1381; 

skutkuje zawsze w tym komunikacie o błędzie:

Error Code: 1265. Data truncated for column 'subcommittee' at row 1 

(Person 1381 jest w bazie danych, w przypadku, gdy zastanawiasz się, czy nie będę nawet zdobyć się tego komunikatu o błędzie).

Wybór innego enum działa:

update person set subcommittee = 'Floater' where person_pk = 1381; 

1 row(s) affected Rows matched: 1 Changed: 1 Warnings: 0 

I Najpierw zauważyłem to, gdy dostałem błąd z mojej aplikacji PHP za pomocą PDO, ale następnie odtworzyć go w MySQLWorkbench, z którego powyższe zostało zrobione.

Być może usunięcie całej kolumny i ponowne jej zdefiniowanie pozwoliłoby obejść problem, ale jest to aktualna baza danych, w której chcę tylko dodać jedną dodatkową wartość wyliczeniową (Student).

Próbowałem przepisać instrukcję alter, kopiując ją do edytora tekstu, aby zbadać znaki i kilka innych rzeczy, aby wykluczyć dziwne, niewidoczne znaki w wartości. Zmieniłem również wartości:

ALTER TABLE person MODIFY COLUMN subcommittee 
    ENUM('Arts','Bus','HC','IA','Pol','ST', 'Student','Floater') NULL DEFAULT NULL; 

Bez radości.

Widziałem kilka błędów związanych z modyfikowaniem kolumny wyliczeniowej, gdy trochę googlowałem. Czy ktoś wie, czy jest to błąd MySQL?

(MySQL w wersji 5.5.28.)


Niektóre dane kilka osób zapytało o:

mysql> describe person; 
+------------------------------+-------------------------------------------------------------+------+-----+---------+----------------+ 
| Field      | Type              | Null | Key | Default | Extra   | 
+------------------------------+-------------------------------------------------------------+------+-----+---------+----------------+ 
| person_pk     | int(11)              | NO | PRI | NULL | auto_increment | 
| name_last     | varchar(255)            | NO | MUL |   |    | 
| name_first     | varchar(255)            | YES |  | NULL |    | 
| name_index     | int(11)              | NO |  | 0  |    | 
| name_middle     | varchar(255)            | YES |  | NULL |    | 
| name_spouse_or_partner_first | varchar(255)            | YES |  | NULL |    | 
| name_spouse_or_partner_last | varchar(255)            | YES |  | NULL |    | 
| name_legal_first    | varchar(255)            | YES |  | NULL |    | 
| name_legal_middle   | varchar(255)            | YES |  | NULL |    | 
| name_legal_last    | varchar(255)            | YES |  | NULL |    | 
| prefix      | varchar(255)            | YES |  | NULL |    | 
| suffix      | varchar(255)            | YES |  | NULL |    | 
| salutation     | varchar(255)            | YES |  | NULL |    | 
| home_street1     | varchar(255)            | YES |  | NULL |    | 
| home_street2     | varchar(255)            | YES |  | NULL |    | 
| home_city     | varchar(255)            | YES |  | NULL |    | 
| home_state     | varchar(255)            | YES |  | NULL |    | 
| home_zip      | varchar(255)            | YES |  | NULL |    | 
| home_country     | varchar(255)            | YES |  | NULL |    | 
| work_org      | varchar(255)            | YES |  | NULL |    | 
| work_street1     | varchar(255)            | YES |  | NULL |    | 
| work_street2     | varchar(255)            | YES |  | NULL |    | 
| work_city     | varchar(255)            | YES |  | NULL |    | 
| work_state     | varchar(255)            | YES |  | NULL |    | 
| work_zip      | varchar(255)            | YES |  | NULL |    | 
| work_country     | varchar(255)            | YES |  | NULL |    | 
| phone_home     | varchar(255)            | YES |  | NULL |    | 
| phone_work     | varchar(255)            | YES |  | NULL |    | 
| phone_mobile     | varchar(255)            | YES |  | NULL |    | 
| phone_fax     | varchar(255)            | YES |  | NULL |    | 
| phone5      | varchar(255)            | YES |  | NULL |    | 
| phone6      | varchar(255)            | YES |  | NULL |    | 
| email      | varchar(255)            | YES |  | NULL |    | 
| email2      | varchar(255)            | YES |  | NULL |    | 
| website      | varchar(255)            | YES |  | NULL |    | 
| preferred_communication  | enum('home','work','mobile','email','mail','special')  | YES |  | NULL |    | 
| preferred_communication_text | varchar(255)            | YES |  | NULL |    | 
| preferred_address   | enum('home','work')           | YES |  | NULL |    | 
| use_housing     | tinyint(1)             | YES |  | NULL |    | 
| smoker      | tinyint(1)             | YES |  | NULL |    | 
| pet_allergies    | tinyint(1)             | YES |  | NULL |    | 
| pets       | tinyint(1)             | YES |  | NULL |    | 
| kids       | tinyint(1)             | YES |  | NULL |    | 
| physical_considerations  | text              | YES |  | NULL |    | 
| dietary_needs    | text              | YES |  | NULL |    | 
| appellation     | varchar(255)            | YES |  | NULL |    | 
| bio       | text              | YES |  | NULL |    | 
| photo      | varchar(255)            | YES |  | NULL |    | 
| include_in_directory   | tinyint(1)             | YES |  | NULL |    | 
| participant_notes   | text              | YES |  | NULL |    | 
| contact_notes    | text              | YES |  | NULL |    | 
| available_1A     | tinyint(1)             | YES |  | NULL |    | 
| available_1P     | tinyint(1)             | YES |  | NULL |    | 
| available_2A     | tinyint(1)             | YES |  | NULL |    | 
| available_2P     | tinyint(1)             | YES |  | NULL |    | 
| available_3A     | tinyint(1)             | YES |  | NULL |    | 
| available_3P     | tinyint(1)             | YES |  | NULL |    | 
| available_4A     | tinyint(1)             | YES |  | NULL |    | 
| available_4P     | tinyint(1)             | YES |  | NULL |    | 
| available_5A     | tinyint(1)             | YES |  | NULL |    | 
| available_5P     | tinyint(1)             | YES |  | NULL |    | 
| interest_x_dis    | tinyint(1)             | YES |  | NULL |    | 
| interest_arts    | tinyint(1)             | YES |  | NULL |    | 
| interest_bus     | tinyint(1)             | YES |  | NULL |    | 
| interest_hc     | tinyint(1)             | YES |  | NULL |    | 
| interest_ia     | tinyint(1)             | YES |  | NULL |    | 
| interest_med     | tinyint(1)             | YES |  | NULL |    | 
| interest_pol     | tinyint(1)             | YES |  | NULL |    | 
| interest_st     | tinyint(1)             | YES |  | NULL |    | 
| venue_manager    | tinyint(1)             | YES |  | NULL |    | 
| committee_arts    | tinyint(1)             | YES |  | NULL |    | 
| committee_bus    | tinyint(1)             | YES |  | NULL |    | 
| committee_hc     | tinyint(1)             | YES |  | NULL |    | 
| committee_ia     | tinyint(1)             | YES |  | NULL |    | 
| committee_pol    | tinyint(1)             | YES |  | NULL |    | 
| committee_st     | tinyint(1)             | YES |  | NULL |    | 
| committee_students   | tinyint(1)             | YES |  | NULL |    | 
| committee_housing   | tinyint(1)             | YES |  | NULL |    | 
| committee_moderator   | tinyint(1)             | YES |  | NULL |    | 
| committee_volunteer   | tinyint(1)             | YES |  | NULL |    | 
| committee_fundraising  | tinyint(1)             | YES |  | NULL |    | 
| committee_office    | tinyint(1)             | YES |  | NULL |    | 
| committee_other    | tinyint(1)             | YES |  | NULL |    | 
| committee_notes    | text              | YES |  | NULL |    | 
| houser_fk     | int(11)              | YES | MUL | NULL |    | 
| housed_fk     | int(11)              | YES | MUL | NULL |    | 
| contact_fk     | int(11)              | YES | MUL | NULL |    | 
| hyphen_fk     | int(11)              | YES | MUL | NULL |    | 
| introduced_by_fk    | int(11)              | YES | MUL | NULL |    | 
| committee_contact_fk   | int(11)              | YES | MUL | NULL |    | 
| donor      | tinyint(1)             | YES |  | NULL |    | 
| houser      | tinyint(1)             | YES |  | NULL |    | 
| moderator     | tinyint(1)             | YES |  | NULL |    | 
| producer      | tinyint(1)             | YES |  | NULL |    | 
| committee_member    | tinyint(1)             | YES |  | NULL |    | 
| participant     | tinyint(1)             | YES |  | NULL |    | 
| fan       | tinyint(1)             | YES |  | NULL |    | 
| student      | tinyint(1)             | YES |  | NULL |    | 
| volunteer     | tinyint(1)             | YES |  | NULL |    | 
| staff      | tinyint(1)             | YES |  | NULL |    | 
| companion     | tinyint(1)             | YES |  | NULL |    | 
| id_number     | int(11)              | YES |  | NULL |    | 
| deceased      | tinyint(1)             | YES |  | NULL |    | 
| load_donation    | tinyint(1)             | YES |  | NULL |    | 
| load_panel     | tinyint(1)             | YES |  | NULL |    | 
| load_participant    | tinyint(1)             | YES |  | NULL |    | 
| conversion_note    | text              | YES |  | NULL |    | 
| replacedby_fk    | int(11)              | YES | MUL | NULL |    | 
| companion_to_fk    | int(11)              | YES | MUL | NULL |    | 
| name_for_program    | varchar(255)            | YES |  | NULL |    | 
| gender      | enum('male','female')          | YES |  | NULL |    | 
| subcommittee     | enum('Arts','Bus','HC','IA','Pol','ST','Student','Floater') | YES |  | NULL |    | 
| companion_type    | enum('spouse/partner','child','friend')      | YES |  | NULL |    | 
| days_here     | varchar(6)             | YES |  | NULL |    | 
| new_or_returning    | enum('new','returning')          | YES |  | NULL |    | 
| confirmation_sheet   | tinyint(1)             | YES |  | NULL |    | 
| bio_in      | tinyint(1)             | YES |  | NULL |    | 
| photo_in      | tinyint(1)             | YES |  | NULL |    | 
| birthday      | date              | YES |  | NULL |    | 
| date_topics_letter_sent  | date              | YES |  | NULL |    | 
| topics_received    | tinyint(1)             | YES |  | NULL |    | 
| rating      | enum('A','B','C','D','F')         | YES |  | NULL |    | 
| flight_info_received   | tinyint(1)             | YES |  | NULL |    | 
| transportation_email_sent | tinyint(1)             | YES |  | NULL |    | 
| bringing_children   | tinyint(1)             | YES |  | NULL |    | 
| date_address_verfied   | date              | YES |  | NULL |    | 
+------------------------------+-------------------------------------------------------------+------+-----+---------+----------------+ 
126 rows in set (0.01 sec) 

mysql> select person_pk, subcommittee from person where person_pk = 1381; 
+-----------+--------------+ 
| person_pk | subcommittee | 
+-----------+--------------+ 
|  1381 | Floater  | 
+-----------+--------------+ 
1 row in set (0.00 sec) 
+0

proszę wyświetlić dane wyjściowe zapytań poniżej: 'opis osoby' i' wybierz * od osoby, gdzie person_pk = 1381' – AlecTMH

+0

Proszę dodać wynik ** pokaż utwórz osobę w tabeli **. –

+0

Zbyt długo, aby opublikować jako komentarz - patrz wyżej. –

Odpowiedz

0

Sądząc this answer, wydaje się, że poprzedni porządek ENUM musi być tak samo, z nowymi możliwościami na końcu. Powiedziałbym więc, zobacz, co oryginalna kolejność była z SHOW CREATE TABLE, a następnie dołączyć Student na końcu tej listy.

+0

To właśnie zrobiłem na początku, mattedgod - nowa wartość "Student" była na końcu, a inne wartości były takie same. –

1

Jest to bardzo drażliwy temat z MySQL

pisałem posty o zmianę list ENUM w Stack Exchange Network DBA

Jest ryzykowny biznes, gdy robimy to z zapełnionymi danymi. Powinieneś był to zrobić z pustą tabelą, a następnie ponownie załadować tabelę.

+0

Dzięki ... Myślę, że potwierdziłeś, że to błąd. MySQL powinien albo wykonać zmianę, albo złożyć skargę. Wygląda na to, że nie zrobiło to ani. –

1

Podsumowuję, że jest to błąd.MySQL nie zgłosił żadnych błędów, gdy wykonał zmianę, i pokazał nową wartość podczas wyświetlania szczegółów kolumny, ale nie wierzył, że nowa wartość istnieje. RolandoMySQLDBA potwierdził, że jest to "drażliwy temat" (jego słowa).

Więc co zrobiłem było tak:

  1. Utwórz nową kolumnę enum nazwie 'subcommittee2'.

  2. Zaktualizuj wartości nowej kolumny i starej (podkomitet zestawu aktualizacji osoba = podkomitet2).

  3. Zmień nazwę "podkomitetu" na "podkomitet".

  4. Zmień nazwę "podkomitetu2" na "podkomitet".

Uruchomienie przez aplikację potwierdza, że ​​nowa wartość została zaakceptowana.


AKTUALIZACJA: Teraz klient poprosił o kolejne wyliczenie i użycie powyższej techniki nie zadziałało. Tym razem tworzenie nowej kolumny, przenoszenie wartości i zmiana jej nazwy nie działały. Ten sam komunikat o błędzie.

UPDATE2: Stworzyłem nową kolumnę "podkomitet2", zapełniłem ją ze starej kolumny i po prostu zostawiłem w ten sposób. W mojej aplikacji zmieniłem nazwę na nową nazwę kolumny. Yucky, ale trzeba wykonać swoją pracę ...

UPDATE3: Próbowałem dodać wartości wyliczeniowe na innym polu i zadziałało, więc teraz mam tę teorię: nowo dodane wartości nie muszą dłużej niż istniejące wartości. Na przykład najdłuższa wartość w tym przypadku była "akceptowana", a ja dodałem wartości "wstrzymaj" i "czekaj", które działały bez zarzutu. (Przypomnijmy, że pierwotny błąd to "Dane obcięte").

Powiązane problemy