PostgreSQL 8.4'te sütun veri türünü karakterden sayısal olarak değiştirme


136

Aşağıdaki sorguyu kullanıyorum:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

bir sütunun veri türünü değiştirmek character(20)için numeric(10,0)ama hata alıyorum:

"kod" sütunu sayısal tipe dönüştürülemiyor

Yanıtlar:


241

Kullanmayı deneyebilirsiniz USING:

İsteğe bağlı USINGmadde, yeni sütun değerinin eskiden nasıl hesaplanacağını belirtir; atlanırsa, varsayılan dönüşüm eski veri türünden yeniye atanan bir atamayla aynıdır. USINGEski türden yeni türe herhangi bir örtük veya atama yoksa, bir madde sağlanmalıdır.

Dolayısıyla bu işe yarayabilir (verilerinize bağlı olarak):

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

codeSayısal olarak kullanılamayan bir şeyiniz varsa bu başarısız olur ; KULLANMA işlemi başarısız olursa, sütun türünü değiştirmeden önce sayısal olmayan verileri el ile temizlemeniz gerekir.


Bu sütun başka bir tabloda yabancı anahtar olarak kullanılır, sanırım ben de bunun veri türünü değiştirmek zorunda kalacak?
user728630

2
@ user728630: FK'yi bırakmanız, her iki sütunu değiştirmeniz ve ardından FK'yi geri eklemeniz gerekir. Oynamak için bir test veritabanınız ve üretim veritabanınızın yedeği var, değil mi?
mu çok kısa

Yabancı anahtar kısıtlamasını sildim, veri tipini değiştirdim ama bundan sonra FK ekleyemedim. Aşağıdaki hatayı alıyorum: "faturalar" tablosuna ekleme veya güncelleme yabancı anahtar kısıtlamasını ihlal ediyor "invoice_presale_fk" DETAY: Anahtar (satış, cpf_cnpj) = (4,05943560000101) "ön satışlar" tablosunda mevcut değil.
user728630

2
@funwhilelost Bu bir tür döküm . Bağlantılı ALTER TABLE dokümanları KULLANIM ile neler kullanabileceğinizi kapsar.
mu çok kısa

3
@muistooshort Dokümanlardan aslında bir ifade olduğunu görüyorum. Bu daha mantıklı. Oyuncu kadrosu beni hazırlıksız yakaladı. Ben sona erdiTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost

7

Senin Eğer VARCHARkolon (olan boş dizeleri içeren değil aynı NULLHatırlayacağınız edebileceğiniz gibi PostgreSQL için) birini varsayılan ayarlamak için aşağıdaki hattında bir şey kullanmak gerekir:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

( bu cevabın yardımıyla bulundu )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.