Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PostgreSQL ERROR: INSERT has more target columns than expressions, when it doesn't

Tags:

postgresql

So I'm starting with this...

SELECT * FROM parts_finishing; 

...I get this...

id, id_part, id_finish, id_metal, id_description, date, inside_hours_k, inside_rate, outside_material

(0 rows)

...so everything looks fine so far so I do this...

INSERT INTO parts_finishing  (  id_part, id_finish, id_metal, id_description,   date, inside_hours_k, inside_rate, outside_material ) VALUES ( ('1013', '6', '30', '1', NOW(), '0', '0', '22.43'),  ('1013', '6', '30', '2', NOW(), '0', '0', '32.45')); 

...and I get...

ERROR: INSERT has more target columns than expressions

Now I've done a few things like ensuring numbers aren't in quotes, are in quotes (would love a table guide to that in regards to integers, numeric types, etc) after I obviously counted the number of column names and values being inserted. I also tried making sure that all the commas are commas...really at a loss here. There are no other columns except for id which is the bigserial primary key.

like image 629
John Avatar asked Dec 24 '14 15:12

John


2 Answers

Remove the extra () :

INSERT INTO parts_finishing  (  id_part, id_finish, id_metal, id_description,   date, inside_hours_k, inside_rate, outside_material ) VALUES    ('1013', '6', '30', '1', NOW(), '0', '0', '22.43') , ('1013', '6', '30', '2', NOW(), '0', '0', '32.45')   ; 

the (..., ...) in Postgres is the syntax for a tuple literal; The extra set of ( ) would create a tuple of tuples, which makes no sense.

Also: for numeric literals you don't want the quotes:

(1013, 6, 30, 1, NOW(), 0, 0, 22.43) , ... 

, assuming all these types are numerical.

like image 182
wildplasser Avatar answered Sep 22 '22 17:09

wildplasser


I had a similar problem when using SQL string composition with psycopg2 in Python, but the problem was slightly different. I was missing a comma after one of the fields.

INSERT INTO parts_finishing (id_part, id_finish, id_metal) VALUES (     %(id_part)s <-------------------- missing comma     %(id_finish)s,     %(id_metal)s ); 

This caused psycopg2 to yield this error:

ERROR: INSERT has more target columns than expressions.

like image 29
2dor Avatar answered Sep 19 '22 17:09

2dor