我创建了一个小型开发数据库以供练习。它有一个cities
带有列cityname
和的表state
。里面有“cityname
辛辛那提”,长名字对吗?
mytestdb=# SELECT * FROM cities;
cityid | cityname | state
--------+------------+-------
12345 | Cincinnati | Ohio
(1 row)
我不清楚在尝试添加“旧金山”时如何以及为什么会收到此错误消息。
mytestdb=# INSERT INTO cities VALUES ('San Francisco','CA'); ERROR: value too long for type character varying(5)
所以首先,有什么区别..
这是输出
所以..
而且,如果
Cincinnati
在 a 中varchar(5)
,它必须被截断。所以问题出在你的
cityid
. 它是varchar(5)
。你可能希望它成为一个int
无论如何 - 它会更紧凑和更快。所以ALTER
表并修复它。作为旁注......也许有一天PostgreSQL会在错误消息中说出列名。在那之前,至少它比 SQL Server 更冗长。
问题的根源在于
INSERT
没有目标列列表——这是一种很流行的自取其辱的方式。仅当您确切知道自己在做什么时才使用此语法快捷方式。
手册
INSERT
:解决方法:明确列出目标列。
这是假设
cityid
可以为 NULL 或具有列默认值。通常,该表应如下所示:
理想情况下,您还有一个表格,
state
列出了所有可能的状态以及FOREIGN KEY
对它的引用。关于
serial
: