db_insert() returnează o cheie greșită (Drupal, 7, Bază De Date)

alechko a intrebat.

Încerc să migrez de la drupal_write_record() la db_insert() / db_update(),dar db_insert() returnează o cheie ciudată în loc de ultima cheie inserată.

Pe o tabelă goală, fac o inserare, iar în loc de numărul real al rândului (ar trebui să fie 1, nu?), primesc unul greșit.

$fields['created'] = REQUEST_TIME;
$fields['uid'] = 1;
$insert = db_insert('table')->fields($fields);
$last_insert_id = $insert->execute(); // suppose to be 1, but = 43587087

Aveți vreo idee?Mulțumesc.

1 răspunsuri
Clive

Numărul autonom nu este legat de numărul de înregistrări din tabel, ci mai degrabă de numărul AUTO_INCREMENT valoare a coloanei cheie primară a tabelului.

Dacă aveți un tabel complet nou și adăugați 100 de rânduri, următorul ID va fi 101. Dacă eliminați pur și simplu toate rândurile din tabel, următorul ID va fi în continuare va fi 101, cu excepția cazului în care TRUNCATE tabelului sau să resetați coloana AUTO_INCREMENT coloana.

Pentru o modalitate ușoară de testare, porniți clientul DB preferat și introduceți o înregistrare în baza de date. Dacă obțineți 1 ca următorul ID de inserare, există o eroare la instalarea Drupal/ motorul BD. În caz contrar, este vorba doar de ceea ce este menționat mai sus.

Comentarii

  • Eu mă refer la o nouă tabelă trunchiată, iar ID-ul pe care îl văd în BD este 1. Deci despre ce bug vorbești? folosirea drupal_write_record() funcționează perfect, returnând ID-ul corect pe aceeași instalare / motor de BD. –  > Por alechko.
  • Asta nu prea are niciun sens, drupal_write_record() folosește valoarea returnată de la db_insert() în mod explicit, astfel încât nu ar exista nicio diferență logică. Nu vorbesc despre niciun bug în particular, știu doar că nu este o problemă pe o instalare standard Drupal/server, așa că trebuie să fie ceva non-standard la configurația ta –  > Por Clive.
  • Nu, nu este. drupal_write_record() folosește db_insert() pentru InsertQuery, dar folosește Database::RETURN_INSERT_ID pentru a returna ultimul ID, în timp ce db_insert() folosește funcția InsertQuery::execute() pentru a returna ID-ul. –  > Por alechko.
  • Nu, nu o face, utilizează if ($query_return = $query->execute()) {. Opțiunea return este verificată în funcție de Database::RETURN_INSERT_ID, , dar această constantă nu este folosită pentru a determina noul ID în niciun fel –  > Por Clive.
  • Mă întrebam doar – există o singură coloană AI în acest tabel? Și cheia nu este compozită? Drupal nu-i plac PK-urile compuse. –  > Por Mołot.