PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Hành vi KHÔNG THÍCH với giá trị NULL

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ữ trong pg_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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để lấy một cột có các số liên tiếp, tăng dần mà không bị thiếu số nào?

  2. Cách hoạt động của hàm Degrees () trong PostgreSQL

  3. heroku, postgreSQL, django, comments, Deliciousypie:Không có toán tử nào phù hợp với (các) loại đối số và tên đã cho. Bạn có thể cần thêm phôi loại rõ ràng

  4. Tại sao PostgreSQL không trả về giá trị null khi điều kiện là <> true

  5. PostgreSQL:nối tiếp và danh tính