Giới thiệu về NULL
'anything' NOT LIKE NULL
sản lượng NULL
, không phải TRUE
.
Và chỉ TRUE
đủ điều kiện cho các biểu thức lọc trong WHERE
mệnh đề.
Hầu hết các hàm trả về NULL
trên NULL
đầu vào (có ngoại lệ). Đó là bản chất của NULL
trong bất kỳ RDBMS thích hợp.
Nếu bạn muốn có một độc thân biểu hiện, bạn có thể sử dụng:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
Tuy nhiên, điều đó hầu như không ngắn hơn hoặc nhanh hơn. Chi tiết trong sách hướng dẫn.
Truy vấn thích hợp
Truy vấn của bạn vẫn không đáng tin cậy. Riêng tên bảng không phải là duy nhất trong cơ sở dữ liệu Postgres, bạn cần chỉ định tên lược đồ ngoài ra hoặc dựa vào search_path
hiện tại để tìm kết quả phù hợp đầu tiên trong đó:
Có liên quan:
- Cách search_path ảnh hưởng đến độ phân giải của mã định danh và "giản đồ hiện tại"
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'hstore1'
AND table_schema = 'public' -- your schema
AND (column_default IS NULL OR
column_default NOT LIKE 'nextval%');
Tốt hơn, nhưng vẫn không chống đạn. Một cột mặc định bắt đầu bằng 'nextval' không tạo ra một serial
, chưa. Xem:
- Cột bảng tăng dần tự động
Để chắc chắn, hãy kiểm tra xem trình tự đang sử dụng có thuộc "quyền sở hữu" của cột có pg_get_serial_sequence(table_name, column_name)
.
Tôi hiếm khi tự mình sử dụng lược đồ thông tin. Các chế độ xem chậm, cồng kềnh đó đảm bảo tính di động trên các phiên bản chính - và hướng đến tính khả chuyển sang các RDBMS tuân thủ tiêu chuẩn khác. Nhưng dù sao nhiều quá cũng không tương thích. Oracle thậm chí không triển khai lược đồ thông tin (tính đến năm 2015).
Ngoài ra, các cột hữu ích dành riêng cho Postgres bị thiếu trong lược đồ thông tin. Đối với trường hợp này, tôi có thể truy vấn danh mục hệ thống như sau:
SELECT *
FROM pg_catalog.pg_attribute a
WHERE attrelid = 'table1'::regclass
AND NOT attisdropped -- no dropped (dead) columns
AND attnum > 0 -- no system columns
AND NOT EXISTS (
SELECT FROM pg_catalog.pg_attrdef d
WHERE (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
AND d.adsrc LIKE 'nextval%'
AND pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
);
Nhanh hơn và đáng tin cậy hơn, nhưng ít di động hơn.
Hướng dẫn sử dụng:
Danh mục
pg_attrdef
lưu trữ các giá trị mặc định của cột. Thông tin cơ bản về các cột được lưu trữ trongpg_attribute
(xem bên dưới). Chỉ những cột chỉ định rõ ràng giá trị mặc định (khi bảng được tạo hoặc cột được thêm vào) mới có mục nhập ở đây.
'table1'::regclass
sử dụng search_path
để giải quyết tên, tránh sự mơ hồ. Bạn có thể xác định điều kiện lược đồ cho tên để ghi đè:'myschema.table1'::regclass
.
Có liên quan:
- Tìm tên bảng được tham chiếu bằng cách sử dụng bảng, trường và tên giản đồ
- Nhận các giá trị mặc định của các cột trong bảng trong Postgres?