PostgreSQL中字符串文字"x"的"列'x'不存在"错误

Luc*_*pus 9 sql postgresql constraints

可能重复:
列'mary'不存在

我需要通过检查约束检查可以接受到列的值.我需要使用检查约束,因为这是为了大学任务.

我使用此代码创建约束并将其添加到表中.

CREATE TABLE Ereignis(
  E_Id Serial PRIMARY KEY,
  Typ varchar(15),
  Zeitpunkt timestamp,
  Ort varchar(32),
  Anzahl_Pers int
);

ALTER TABLE Ereignis ADD 
CONSTRAINT typ_ch CHECK (Typ in (’Verkehrsunfall’, ’Hochwasser’, ’Sonstiges’));
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

 ERROR:  column "’verkehrsunfall’" does not exist
Run Code Online (Sandbox Code Playgroud)

当我从这个错误中得到它时,它试图将列typ与列verkehrsunfall进行比较,在那里我尝试检查列try尝试得到的值是('Verkehrsunfall','Hochwasser','Sonstiges')字符串之一.

这与讲师在讲座中向我们展示的语法完全相同.我不确定是否可以将varchars与check进行比较?或者我做错了什么?

以下是讲座的例子:

CREATE TABLE Professoren 
(PersNr INTEGER PRIMARYKEY,
 Name VARCHAR( 3 0 ) NOT NULL ,
 Rang CHAR(2) CHECK (Rang in ('C2' ,'C3' ,'C4')) , 
 Raum INTEGER UNIQUE) ;
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 19

您的文本编辑器或文字处理器正在使用所谓的智能引号,例如,不是普通的单引号'.'对文字使用普通单引号(实际上是撇号),或者"为标识符使用双引号.你还有一些奇怪的逗号,可能会导致语法错误.请参阅PostgreSQL手册中的SQL语法,特别是词法结构.

不要在字处理器中编辑SQL(或任何其他源代码).一个体面的文本编辑器,如Notepad ++,BBEdit,vim等,不会像这样破坏你的SQL.

更正示例:

CREATE TABLE Professoren 
(PersNr INTEGER PRIMARYKEY,
 Name VARCHAR(30) NOT NULL,
 Rang CHAR(2) CHECK (Rang in ('C2' ,'C3' ,'C4')), 
 Raum INTEGER UNIQUE);
Run Code Online (Sandbox Code Playgroud)

它不会导致完全语法错误的原因 - 而是给你一个关于列不存在的奇怪错误消息 - 是因为PostgreSQL接受unicode列名并认为该字符是标识符的完全有效字符.注意:

regress=> SELECT 'dummy text' AS won’t, 'dummy2' as ’alias’;
   won’t    | ’alias’ 
------------+---------
 dummy text | dummy2
(1 row)
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个名为列的列test并且您要求命名的列’test’,PostgreSQL将正确地告诉您没有命名的列’test’.在您的情况下,’verkehrsunfall’当您打算使用文字字符串时,您要求输入一个列Verkehrsunfall,因此会显示错误消息,指出该列’verkehrsunfall’不会退出.

如果它是一个真正的单引号,那将是无效的语法.第一个不会在psql中执行,因为它有一个未闭合的单引号; 第二个会失败,例如:

regress=>  SELECT 'dummy2' as 'alias';
ERROR:  syntax error at or near "'alias'"
LINE 1: SELECT 'dummy2' as 'alias';
Run Code Online (Sandbox Code Playgroud)

...因为在ANSI SQL中,它试图使用文字作为标识符.正确的语法是标识符的双引号或根本没有引号:

regress=> SELECT 'dummy2' as "alias", 'dummy3' AS alias;
 alias  | alias  
--------+--------
 dummy2 | dummy3
(1 row)
Run Code Online (Sandbox Code Playgroud)

varchar typmod中也有一个不需要的空间; varchar( 3 0 )是无效的:

regress=> SELECT 'x'::varchar( 3 0 );
ERROR:  syntax error at or near "0"
LINE 1: SELECT 'x'::varchar( 3 0 );
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在PostgreSQL中,通常使用text列代替varchar 更好.如果您需要应用程序或验证原因的长度约束,请添加检查约束length(colname).