2012-11-04 46 views
9

thể trùng lặp:
Column ‘mary’ does not exist"Cột 'x' không tồn tại" lỗi cho chuỗi chữ 'x' trong PostgreSQL

Tôi cần phải kiểm tra các giá trị có thể được chấp nhận một cột thông qua ràng buộc kiểm tra. Tôi cần phải sử dụng ràng buộc kiểm tra, bởi vì đây là một bài tập đại học.

Tôi sử dụng mã này để tạo và thêm ràng buộc vào bảng.

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’)); 

Đây là lỗi tôi nhận được:

ERROR: column "’verkehrsunfall’" does not exist 

Như tôi đã nhận được từ lỗi này nó cố gắng để so sánh cột typ với cột verkehrsunfall, nơi như tôi cố gắng để kiểm tra các giá trị mà cột thử có thể nhận được là một trong các chuỗi ('Verkehrsunfall', 'Hochwasser', 'Sonstiges').

Đây chính xác là cú pháp giống như những gì giảng viên của chúng tôi đã cho chúng tôi thấy tại bài giảng. Tôi không chắc chắn nếu nó có thể so sánh varchars với kiểm tra? Hay tôi đang làm gì sai?

Dưới đây là ví dụ từ bài giảng:

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

Đây có phải là (http://stackoverflow.com/q/13196572/398670) từ cùng một tài liệu khóa học không? Thời gian làm cho nó có vẻ như nó có thể là một số giảng viên đã chỉnh sửa SQL trong một trình xử lý văn bản và đưa nó ra dưới dạng PDF hoặc các ghi chú trên trang web mà sinh viên đã sao chép và dán ... –

+1

Cú pháp là chính xác nếu bạn sử dụng dấu nháy đơn chính xác: http://www.sqlfiddle.com/#!12/fb4ec –

+1

Chỉ cần một FYI quy ước đặt tên của bạn là không tốt. Hoặc sử dụng dưới điểm số như first_name hoặc nếu bạn muốn đi những gì các tuyến đường lý tưởng ít hơn bạn có thể làm "FirstName". Không pha trộn và kết hợp các thủ đô và dấu gạch dưới. Điều này nói chung là đặt tên, nhưng cụ thể đối với postgres tôi sẽ bám theo điểm số để phân tách các từ và không sử dụng chữ in hoa. – Kuberchaun

Trả lời

19

soạn thảo văn bản của bạn hoặc xử lý văn bản đang sử dụng cái gọi là dấu ngoặc kép thông minh, giống như , không dấu nháy đơn bình thường, giống như '. Sử dụng dấu nháy đơn thông thường (thực tế là dấu nháy đơn) ' cho chữ, hoặc dấu ngoặc kép " cho số nhận dạng. Bạn cũng có một số dấu phẩy lẻ trong đó có thể gây ra lỗi cú pháp. Xem the PostgreSQL manual on SQL syntax, cụ thể là lexical structure.

Không chỉnh sửa SQL (hoặc bất kỳ mã nguồn nào khác) trong bộ xử lý văn bản. Một trình soạn thảo văn bản phong nha như Notepad++, BBEdit, vim, v.v., sẽ không làm xáo trộn SQL của bạn như thế này.

dụ Corrected:

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

Lý do nó không gây ra một lỗi cú pháp hoàn toàn - và thay vào đó cung cấp cho bạn một thông báo lỗi kỳ lạ về cột không tồn tại - là vì PostgreSQL chấp nhận tên cột unicode và xem xét ký tự một ký tự hoàn toàn hợp lệ cho số nhận dạng. Quan sát:

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

Vì vậy, nếu bạn có một cột tên là test và bạn yêu cầu cột có tên ’test’, PostgreSQL sẽ một cách chính xác cho bạn biết rằng không có cột tên ’test’. Trong trường hợp của bạn, bạn yêu cầu một cột có tên là ’verkehrsunfall’ khi bạn định sử dụng chuỗi ký tự chữ cái Verkehrsunfall thay vào đó, do đó thông báo lỗi cho biết cột ’verkehrsunfall’ không thoát.

Nếu đó là một dấu nháy đơn thực sự là cú pháp không hợp lệ. Việc đầu tiên sẽ không thực hiện trong psql ở tất cả bởi vì nó muốn có một trích dẫn đơn lẻ không rõ ràng; lần thứ 2 sẽ thất bại với một cái gì đó như:

regress=> SELECT 'dummy2' as 'alias'; 
ERROR: syntax error at or near "'alias'" 
LINE 1: SELECT 'dummy2' as 'alias'; 

...bởi vì trong ANSI SQL, đó là cố gắng sử dụng một chữ như một định danh. Cú pháp đúng sẽ là dấu ngoặc kép cho nhận dạng hoặc không có dấu ngoặc kép ở tất cả:

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

Bạn cũng có một không gian không mong muốn trong typmod varchar; varchar(3 0) không hợp lệ:

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

BTW, trong PostgreSQL nó thường là tốt hơn để sử dụng một cột text thay vì varchar. Nếu bạn muốn có hạn chế về độ dài đối với các lý do ứng dụng hoặc xác thực, hãy thêm ràng buộc kiểm tra vào length(colname).

+0

Cảm ơn rất nhiều, một chi tiết nhỏ như vậy tôi sẽ không nhận ra rằng chúng tương ứng với 2 mã ASCII khác nhau. –

+0

@LuciusRutiliusLupus Chỉ cần chọn nit: chúng không thực sự là ASCII. Một trích dẫn đơn (dấu nháy đơn, thực sự) là, nhưng '' 'là' \ u2019' không nằm trong phạm vi ASCII. Chúng là các mã ký tự khác nhau hoặc các mã mã unicode, chắc chắn. –

Các vấn đề liên quan