Zmień typ pola varchar na integer: "nie można automatycznie przerzucać na typ integer"

Mam małą tabelkę i pewne pole zawiera typ " character various ". Próbuję zmienić go na " Integer ", ale to daje błąd, że odlewanie nie jest możliwe.

Czy Jest jakiś sposób na obejście tego, czy po prostu powinienem utworzyć inną tabelę i wprowadzić do niej rekordy za pomocą zapytania.

Pole zawiera tylko wartości całkowite.

Author: Tshepang, 2012-11-01

7 answers

Nie ma ukrytych (automatycznych) rzutów z text lub varchar do integer (tzn. nie można przekazać varchar do funkcji oczekującej integer lub przypisać pola varchar do integer), więc należy określić jawne rzuty za pomocą ALTER TABLE ... ALTER COLUMN ... Typ ... :

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);

Zauważ, że możesz mieć białe znaki w polach tekstowych; w takim przypadku użyj:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);

Aby usunąć spację przed konwersją.

To było oczywiste z komunikatu o błędzie jeśli polecenie zostało uruchomione w psql, ale możliwe, że PgAdmin-III nie pokazuje pełnego błędu. Oto, co się stanie, jeśli przetestuję go w psql na PostgreSQL 9.2:

=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42  ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR:  column "x" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion. 
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE        

Dzięki @muistooshort za dodanie linku USING.

Zobacz także to powiązane pytanie ; chodzi o migracje Rails, ale przyczyna jest taka sama i odpowiedź ma zastosowanie.

 194
Author: Craig Ringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:37

To zadziałało na mnie.

Zmień kolumnę varchar na int

change_column :table_name, :column_name, :integer

Got:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

CHN do

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
 60
Author: bibangamba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 08:35:04

Spróbuj tego, na pewno zadziała.

Pisząc migracje Rails w celu konwersji kolumny łańcuchowej na liczbę całkowitą, Zwykle mówisz:

change_column :table_name, :column_name, :integer

Jednak PostgreSQL będzie narzekał:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

"podpowiedź" w zasadzie mówi, że musisz potwierdzić, że chcesz, aby tak się stało, i jak dane mają być konwertowane. Po prostu powiedz to w swojej migracji:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

Powyższe będzie naśladować to, co wiesz z innych adapterów baz danych. Jeśli masz dane nieliczbowe, wyniki mogą być nieoczekiwane (ale przecież konwertujesz na liczbę całkowitą).

 6
Author: Subhash Chandra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 12:56:46

Mam ten sam problem. Niż zdałem sobie sprawę, że mam domyślną wartość ciągu dla kolumny próbowałem zmienić. Usunięcie wartości domyślnej sprawiło, że błąd zniknął:)

 2
Author: Valdenir Antoglioli Junior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 15:33:49

Możesz to zrobić tak:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

Lub spróbuj tego:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

Jeśli jesteś zainteresowany, aby znaleźć więcej na ten temat, przeczytaj ten artykuł: https://kolosek.com/rails-change-database-column

 2
Author: Nesha Zoric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-09 08:55:10

Jeśli przypadkowo lub nie pomieszałeś liczb całkowitych z danymi tekstowymi, powinieneś najpierw wykonać poniższe polecenie update (jeśli nie powyżej alter table się nie powiedzie):

UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
 0
Author: webrama.pl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-08 07:40:09

Jeśli pracujesz nad środowiskiem programistycznym (lub na ENV produkcji. może to być kopia zapasowa danych) następnie najpierw wyczyść dane z pola DB lub ustaw wartość jako 0.

UPDATE table_mame SET field_name= 0;

Po tym, aby uruchomić poniższe zapytanie i po pomyślnym uruchomieniu zapytania, do schematu i po tym uruchomić skrypt migrate.

ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric (10,0) USING field_name::numeric;

I think it pomoże Ci.

 0
Author: Sandip Rajput,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-29 13:10:25