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).