Helpex - Trao đổi & giúp đỡ Đăng nhập
126

Tôi có một loạt các hàng mà tôi cần chèn vào bảng, nhưng các chèn này luôn được thực hiện theo lô. Vì vậy, tôi muốn kiểm tra xem một hàng duy nhất trong lô có tồn tại trong bảng không vì sau đó tôi biết tất cả chúng đã được chèn.

Vì vậy, nó không phải là một kiểm tra khóa chính, nhưng không nên quan trọng quá nhiều. Tôi chỉ muốn kiểm tra một hàng duy nhất để count(*)có thể không tốt, vì vậy nó giống như existstôi đoán.

Nhưng vì tôi khá mới với PostgreSQL, tôi muốn hỏi những người biết.

Lô của tôi chứa các hàng có cấu trúc sau:

userid | rightid | remaining_count

Vì vậy, nếu bảng chứa bất kỳ hàng nào với điều kiện useridcó nghĩa là tất cả chúng đều có mặt ở đó.

126 hữu ích 5 bình luận 138k xem chia sẻ
243

Sử dụng từ khóa EXISTS cho lợi nhuận TRUE / FALSE:

select exists(select 1 from contact where id=12)
243 hữu ích 5 bình luận chia sẻ
29

Làm thế nào về đơn giản:

select 1 from tbl where userid = 123 limit 1;

nơi 123là userid của hàng loạt mà bạn sắp chèn.

Truy vấn trên sẽ trả về một tập hợp trống hoặc một hàng đơn, tùy thuộc vào việc có các bản ghi với userid đã cho hay không.

Nếu điều này trở nên quá chậm, bạn có thể xem xét việc tạo một chỉ mục trên tbl.userid.

nếu thậm chí một hàng từ lô tồn tại trong bảng, trong trường hợp đó tôi không phải chèn các hàng của mình vì tôi biết chắc chắn tất cả chúng đều được chèn.

Để điều này vẫn đúng ngay cả khi chương trình của bạn bị gián đoạn giữa đợt, tôi khuyên bạn nên đảm bảo rằng bạn quản lý các giao dịch cơ sở dữ liệu một cách thích hợp (nghĩa là toàn bộ lô được chèn trong một giao dịch).

29 hữu ích 4 bình luận chia sẻ
9
INSERT INTO target( userid, rightid, count )
  SELECT userid, rightid, count 
  FROM batch
  WHERE NOT EXISTS (
    SELECT * FROM target t2, batch b2
    WHERE t2.userid = b2.userid
    -- ... other keyfields ...
    )       
    ;

BTW: nếu bạn muốn toàn bộ lô bị lỗi trong trường hợp trùng lặp, thì (đưa ra một ràng buộc khóa chính)

INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count 
FROM batch
    ;

sẽ làm chính xác những gì bạn muốn: hoặc nó thành công, hoặc nó thất bại.

9 hữu ích 5 bình luận chia sẻ
1
select true from tablename where condition limit 1;

Tôi tin rằng đây là truy vấn mà postgres sử dụng để kiểm tra khóa ngoại.

Trong trường hợp của bạn, bạn cũng có thể làm điều này trong một lần:

insert into yourtable select $userid, $rightid, $count where not (select true from yourtable where userid = $userid limit 1);
1 hữu ích 0 bình luận chia sẻ
0
SELECT 1 FROM user_right where userid = ? LIMIT 1

Nếu tập kết quả của bạn chứa một hàng thì bạn không phải chèn. Nếu không thì chèn hồ sơ của bạn.

0 hữu ích 2 bình luận chia sẻ
0

Nếu bạn nghĩ về hiệu suất, có thể bạn có thể sử dụng "PERFORM" trong một chức năng như thế này:

 PERFORM 1 FROM skytf.test_2 WHERE id=i LIMIT 1;
  IF FOUND THEN
      RAISE NOTICE ' found record id=%', i;  
  ELSE
      RAISE NOTICE ' not found record id=%', i;  
 END IF;
0 hữu ích 2 bình luận chia sẻ
0

Nguyên tắc

chọn tồn tại (chọn true từ xx trong đó xx) là "Does 1 + 1 cộng tối đa 2";

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql postgresql , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading