Đây là một "tính năng" khó hiểu được biết đến với một chút lịch sử. Cụ thể, bạn có thể tham chiếu đến các bộ giá trị tổng thể từ bảng với tên bảng, sau đó thêm .name
sẽ gọi name
chức năng trên chúng (tức là nó sẽ được hiểu là select name(t) from t
).
Tại một số thời điểm trong quá trình phát triển PostgreSQL 9, điều này đã được làm sạch một chút. Bạn vẫn có thể thực hiện select t from t
rõ ràng để có được hiệu ứng hàng dưới dạng bộ, nhưng bạn không thể áp dụng một hàm theo cách tương tự. Vì vậy, trên PostgreSQL 8.4.9 , cái này:
create table t(id serial primary key, value text not null);
insert into t(value) values('foo');
select t.name from t;
tạo ra sự kỳ lạ:
name
---------
(1,foo)
(1 row)
nhưng trên 9.1.1 sản xuất:
ERROR: column t.name does not exist
LINE 1: select t.name from t;
^
như bạn mong đợi.
Vì vậy, để trả lời cụ thể câu hỏi của bạn:name
là một kiểu tiêu chuẩn trong PostgreSQL (được sử dụng trong danh mục cho tên bảng, v.v.) và cũng có một số hàm tiêu chuẩn để chuyển đổi mọi thứ thành name
loại hình. Nó không thực sự được dành riêng, chỉ là những đối tượng tồn tại được gọi như vậy, cộng với một số cú pháp lịch sử kỳ lạ, đã làm cho mọi thứ trở nên khó hiểu; và điều này đã được các nhà phát triển khắc phục trong các phiên bản gần đây.