对于类型字符变化(5),我如何更正这个值太长?

Dan*_*iel 7 postgresql insert postgresql-9.4

我创建了一个用于实践的小型开发数据库。它有一个cities包含列cityname和的表state。该cityname中有“辛辛那提”,长的名字吧?

mytestdb=# SELECT * FROM cities;
 cityid |  cityname  | state
--------+------------+-------
 12345  | Cincinnati | Ohio
(1 row)
Run Code Online (Sandbox Code Playgroud)

我不清楚在尝试添加“旧金山”时如何以及为什么会收到此错误消息。

mytestdb=# INSERT INTO cities VALUES ('San Francisco','CA');
ERROR:  value too long for type character varying(5)
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 3

那么首先,有什么区别..

SELECT x, length(x)
FROM ( VALUES
  ('Cincinnati'),
  ('San Francisco')
) AS t(x);
Run Code Online (Sandbox Code Playgroud)

这是输出

       x       | length 
---------------+--------
 Cincinnati    |     10
 San Francisco |     13
Run Code Online (Sandbox Code Playgroud)

所以..

  1. 旧金山长了三个字符。
  2. 他们都超过5个字符。
  3. 那不可能是问题。

此外,如果Cincinnati位于 a 中varchar(5),则必须将其截断。

所以问题是你的cityid。这是varchar(5)。无论如何,你可能希望它是一个int——它会更紧凑、更快。所以ALTER表并修复它。

ALTER TABLE cities
  ALTER COLUMN cityid SET DATA TYPE int
  USING cityid::int;
Run Code Online (Sandbox Code Playgroud)

顺便说一句……也许有一天 PostgreSQL 会在错误消息中说出列名。在那之前至少它比 SQL Server 更详细