ไม่มีการส่งโดยปริยาย (อัตโนมัติ) จากtext
หรือvarchar
ไปยังinteger
(เช่นคุณไม่สามารถส่งผ่านvarchar
ไปยังฟังก์ชันที่คาดหวังinteger
หรือกำหนดvarchar
เขตข้อมูลให้กับinteger
หนึ่ง) ดังนั้นคุณต้องระบุการส่งที่ชัดเจนโดยใช้ALTER TABLE ... ALTER COLUMN ... TYPE .. การใช้ :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
โปรดทราบว่าคุณอาจมีช่องว่างในช่องข้อความของคุณ ในกรณีนั้นให้ใช้:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
เพื่อตัดพื้นที่สีขาวก่อนที่จะแปลง
สิ่งนี้เห็นได้ชัดจากข้อความแสดงข้อผิดพลาดหากมีการเรียกใช้คำสั่งpsql
แต่เป็นไปได้ที่ PgAdmin-III จะไม่แสดงข้อผิดพลาดทั้งหมด นี่คือสิ่งที่เกิดขึ้นถ้าฉันทดสอบในpsql
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
ขอบคุณ @muistooshort สำหรับการเพิ่มUSING
ลิงค์
ดูคำถามที่เกี่ยวข้องนี้ด้วย; มันเกี่ยวกับการย้ายข้อมูลของ Rails แต่สาเหตุสำคัญเหมือนกันและคำตอบนั้นถูกนำไปใช้
หากข้อผิดพลาดยังคงเกิดขึ้นแสดงว่าอาจไม่เกี่ยวข้องกับค่าคอลัมน์ แต่การจัดทำดัชนีเหนือค่าเริ่มต้นของคอลัมน์หรือคอลัมน์นี้อาจล้มเหลว typecast ดัชนีจะต้องลดลงก่อนที่จะเปลี่ยนคอลัมน์และสร้างขึ้นใหม่หลังจาก ควรเปลี่ยนค่าเริ่มต้นอย่างเหมาะสม