«Ошибка столбца« x »не существует» для строкового литерала «x» в PostgreSQL

Возможный дубликат:
Столбец «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')); 

Вот ошибка, которую я получаю:

  ERROR: column "'verkehrsunfall'" does not exist 

По мере того как я получаю от этой ошибки, он пытается сравнить тип столбца с столбцом verkehrsunfall, где, когда я пытаюсь проверить значения, которые может получить столбец, это одна из строк («Verkehrsunfall», «Hochwasser», «Sonstiges»).

Это тот же синтаксис, который наш лектор показал нам на лекции. Я не уверен, можно ли сравнить varchars с проверкой? Или что я делаю неправильно?

Вот пример из лекции:

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

В текстовом редакторе или текстовом редакторе используются так называемые «умные» кавычки, например ' не обычные одинарные кавычки, например ' . Используйте обычные одинарные кавычки (фактически апострофы) для литералов или двойных кавычек для идентификаторов. У вас также есть некоторые нечетные запятые, которые могут вызывать синтаксические ошибки. См. Руководство 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); 

Причина, по которой он не вызывает прямой синтаксической ошибки, – и вместо этого дает вам сообщение о нечетном сообщении о столбце, который не существует, – это потому, что PostgreSQL принимает имена столбцов Unicode и считает символ «совершенно допустимым для идентификатора». Заметим:

 regress=> SELECT 'dummy text' AS won't, 'dummy2' as 'alias'; won't | 'alias' ------------+--------- dummy text | dummy2 (1 row) 

Таким образом, если у вас есть столбец с именем 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'; 

… потому что в ANSI SQL, который пытается использовать литерал как идентификатор. Правильный синтаксис был бы с двойными кавычками для идентификатора или без кавычек вообще:

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

У вас также есть нежелательное пространство в 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 ); 

BTW, в PostgreSQL обычно лучше использовать text столбец вместо varchar. Если вам нужно ограничение длины для приложения или причины проверки, добавьте ограничение проверки по length(colname) .