2012-05-08 30 views
8

Używam Postgresql, kiedy chcę użyć PDO, aby pobrać najnowszy identyfikator wstawiania, mam problem. Tu jest mój kodu:LastInsertId nie działa w Postgresql

$db->lastInsertId('columnName'); 

Komunikat o błędzie mówi

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

Chyba mam jakieś nieporozumienie o „obiektu sekwencji” zamieszczonego w podręczniku 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. 

Obecnie "columnName" jest ciągiem tego automatycznie zwiększanego atrybutu. Czy ktoś może wskazać, gdzie popełniłem błąd? Dzięki.

+1

Prawdopodobny duplikat [Uzyskaj ostatni identyfikator wkładki po przygotowanym wkładzie z PDO] (http://stackoverflow.com/questions/5057954/get-last-insert-id-after-a-prepared-insert-with-pdo) –

Odpowiedz

15

PostgreSQL używa sequences do generowania wartości dla kolumn serial i kolumn serial są ogólnie używane w kolumnach "auto-inkrementujących" w PostgreSQL. Sekwencje mają nazwy i są generalnie niezależne od konkretnej tabeli, więc możesz mieć jedną sekwencję generującą unikalne identyfikatory dla kilku różnych tabel; nazwa sekwencja jest co lastInsertId chce jako argument:

Na przykład pdo_pgsql() wymaga, aby podać nazwę obiektu sekwencja nazwa parametru.

Sekwencja obiekt utworzony przez PostgreSQL jest automatycznie nazwany [table]_[column]_seq, So:

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

nie działa w ten sposób. PGSQL "wymaga" parametru do wskazania obiektu sekwencji. Jeśli pozostawisz to puste, nic nie zostanie zwrócone. – Michael

+3

@Michael: W takim razie musisz znać nazwę sekwencji. Wartością domyślną jest 't_c_seq', gdzie' t' jest nazwą tabeli, a 'c' jest nazwą kolumny. To wymaganie jest dość dziwne. Nie mam zainstalowanego w PHP/PostgreSQL bankomatu, więc nie jestem w stanie tego zweryfikować. –

+0

table_column_seq, to ​​jest to! Dzięki Ci! – Michael

-1

Użyj nazwy sekwencja nazwa zamiast kolumna

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

wpadłem na ten problem dzisiaj, lastInsertId() była tylko zwracanie fałszu. Znaleźć odpowiedź, że rozwiązać mój problem na innym wątku: https://stackoverflow.com/a/31638196/1477123

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

Więc nazwa sekwencja będzie ingredients_id_seq

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

Więc nazwa sekwencja będzie ingredients_id_seq,

$db->lastInsertId('ingredients_id_seq'); 

Ten format faktycznie rozwiązał moje problemy !!!

+0

możesz również użyć $ db-> nextval(); –

Powiązane problemy