Mam małą tabelkę i pewne pole zawiera typ „ zmienny znak ”. Próbuję zmienić to na „ Integer ”, ale wyświetla błąd, że przesyłanie nie jest możliwe.
Czy istnieje sposób na obejście tego, czy powinienem po prostu utworzyć inną tabelę i wprowadzić do niej rekordy za pomocą zapytania.
Pole zawiera tylko wartości całkowite.
SQL error: ERROR: column "MID" cannot be cast to type integer
SELECT
list, a nie polegać na pozycjach porządkowych kolumn. To powiedziawszy, podejście podane w odpowiedziach zachowa pozycję kolumny.Odpowiedzi:
Nie ma niejawnego (automatycznego) rzutowania z
text
lubvarchar
dointeger
(tj. Nie można przekazać avarchar
do funkcji oczekującejinteger
lub przypisanejvarchar
pola dointeger
jedynki), więc należy określić jawne rzutowanie za pomocą ALTER TABLE ... ALTER COLUMN ... TYPE. .. UŻYWANIE :Zauważ, że możesz mieć spacje w polach tekstowych; w takim przypadku użyj:
aby usunąć odstępy przed konwersją.
Powinno to wynikać z komunikatu o błędzie, jeśli polecenie zostało uruchomione
psql
, ale możliwe, że PgAdmin-III nie pokazuje pełnego błędu. Oto, co się stanie, jeśli przetestuję go wpsql
PostgreSQL 9.2:Dzięki @muistooshort za dodanie
USING
linku.Zobacz także to powiązane pytanie ; chodzi o migracje Railsów, ale przyczyna jest taka sama i odpowiedź ma zastosowanie.
Jeśli błąd nadal występuje, może to być związane nie z wartościami kolumn, ale indeksy w tej kolumnie lub wartości domyślne kolumny mogą zakończyć się niepowodzeniem. Indeksy należy usunąć przed ALTER COLUMN i ponownie utworzyć po. Wartości domyślne należy odpowiednio zmienić.
źródło
psql
dużo szybciej i łatwiej. Niedawno napisałem rant o użyteczności PgAdmina w zakresie tworzenia kopii zapasowych i przywracania: blog.ringerc.id.au/2012/05/...to działało dla mnie.
zmień kolumnę varchar na int
dostał:
chnged to
źródło
Możesz to zrobić tak:
lub spróbuj tego:
Jeśli chcesz dowiedzieć się więcej na ten temat, przeczytaj ten artykuł: https://kolosek.com/rails-change-database-column
źródło
Spróbuj tego, na pewno zadziała.
Pisząc migracje Railsów, aby przekonwertować kolumnę łańcuchową na liczbę całkowitą, zwykle powiesz:
Jednak PostgreSQL będzie narzekać:
„Wskazówka” w zasadzie mówi ci, że musisz potwierdzić, że chcesz, aby tak się stało i jak dane mają być konwertowane. Po prostu powiedz to podczas migracji:
Powyższe będzie naśladować to, co znasz z innych adapterów baz danych. Jeśli masz dane nieliczbowe, wyniki mogą być nieoczekiwane (ale mimo wszystko konwertujesz na liczbę całkowitą).
źródło
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""
zdarza się błądMam ten sam problem. Potem zdałem sobie sprawę, że mam domyślną wartość ciągu dla kolumny, którą próbowałem zmienić. Usunięcie wartości domyślnej sprawiło, że błąd zniknął :)
źródło
Jeśli przypadkowo zmieszałeś liczby całkowite z danymi tekstowymi lub nie, powinieneś najpierw wykonać poniższe polecenie update (jeśli nie powyżej, zmiana tabeli nie powiedzie się):
źródło
regexp_replace(col_name, '[^0-9.]','','g')
jeśli próbujesz usunąć niechciane znaki i spacje. Że trzeba coś nieco bardziej wyrafinowane, jeśli chcesz zachowaćNaN
iInf
i10E42
notacji naukowej, choć.Jeśli pracujesz na środowisku programistycznym (lub na środowisku produkcyjnym, może to być kopia zapasowa danych), najpierw wyczyść dane z pola DB lub ustaw wartość na 0.
Następnie, aby uruchomić poniższe zapytanie, a po pomyślnym uruchomieniu zapytania, do schematu migracji, a następnie uruchom skrypt migracji.
Myślę, że to ci pomoże.
źródło
Miałem ten sam problem. Zacząłem resetować domyślne ustawienia kolumny.
źródło