2012-05-08 25 views
8

Tôi đang sử dụng Postgresql, khi tôi muốn sử dụng PDO để truy xuất ID chèn mới nhất, tôi gặp sự cố. Đây là mã của tôi:lastInsertId không hoạt động trong Postgresql

$db->lastInsertId('columnName'); 

Các thông báo lỗi nói

SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "columnName" does not exist 

Tôi đoán tôi có một số hiểu lầm về "đối tượng chuỗi" đã nêu trong Hướng dẫn sử dụng PHP.

Note: 

Returns the ID of the last inserted row, or the last value from a sequence object, 
depending on the underlying driver. For example, PDO_PGSQL() requires you to specify the 
name of a sequence object for the name parameter. 

Hiện tại, "columnName" là chuỗi thuộc tính tự động tăng. Bất cứ ai có thể chỉ ra nơi tôi đã đi sai? Cảm ơn.

+1

Bản sao có thể có của [Nhận id chèn cuối cùng sau khi chèn được chuẩn bị với PDO] (http://stackoverflow.com/questions/5057954/get-last-insert-id-after-a-prepared-insert-with-pdo) –

Trả lời

15

PostgreSQL sử dụng sequences để tạo giá trị cho các cột serialserial thường được sử dụng cho cột "tự động tăng" trong PostgreSQL. Trình tự có tên và nói chung, độc lập với bất kỳ bảng cụ thể nào để bạn có thể có một chuỗi tạo các ID duy nhất cho một số bảng khác nhau; tên chuỗi là những gì lastInsertId muốn như là đối số của nó:

Ví dụ, PDO_PGSQL() đòi hỏi bạn phải chỉ định tên của một đối tượng chuỗi cho tên tham số.

Đối tượng chuỗi tạo ra bởi PostgreSQL được tự động đặt tên [table]_[column]_seq, Vì vậy:

$id = $db->lastInsertId('tableName_columnName_seq'); 
+5

không hoạt động theo cách đó. PGSQL "yêu cầu" một tham số để chỉ ra đối tượng chuỗi. Nếu bạn để trống, không có gì được trả lại. – Michael

+3

@Michael: Sau đó, bạn cần phải biết tên của chuỗi. Giá trị mặc định sẽ là 't_c_seq' trong đó' t' là tên bảng và 'c' là tên cột. Yêu cầu này là khá kỳ lạ mặc dù. Tôi không có tất cả các PHP/PostgreSQL thiết lập ATM vì vậy tôi không thể xác minh bất kỳ điều này bản thân mình. –

+0

table_column_seq, đây là nó! Cảm ơn bạn! – Michael

-1

Sử dụng tên chuỗi thay vì cột tên

$db->lastInsertId('columnName'); 
3

Tôi chạy vào vấn đề này ngày hôm nay, lastInsertId() là chỉ trở về sai. Tìm thấy những câu trả lời mà giải quyết vấn đề của tôi trên một chủ đề khác nhau: https://stackoverflow.com/a/31638196/1477123

CREATE TABLE ingredients (
    id   SERIAL PRIMARY KEY, 
    name  varchar(255) NOT NULL, 
); 

Vì vậy, các tên dãy sẽ ingredients_id_seq

$db->lastInsertId('ingredients_id_seq'); 
1

Vì vậy, tên chuỗi sẽ ingredients_id_seq,

$db->lastInsertId('ingredients_id_seq'); 

Định dạng này thực sự đã giải quyết được vấn đề của tôi !!!

+0

bạn cũng có thể sử dụng $ db-> nextval(); –

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