bagaimana cara menggunakan currval () di postgresql untuk mendapatkan id yang dimasukkan terakhir?
<p>saya punya meja:</p><pre><code>create table names (id serial, name varchar(20)) </code></pre><p>saya ingin "id yang dimasukkan terakhir" dari tabel itu, tanpa menggunakan <code>returning id</code> pada sisipan. tampaknya ada fungsi <a href="http://www.postgresql.org/docs/current/static/functions-sequence.html"><code>currval()</code></a> , tapi saya tidak mengerti bagaimana menggunakannya.</p><p>saya sudah mencoba:</p><pre><code>select currval() as id from names\_id\_seq select currval('names\_id\_seq') select currval('names\_id\_seq'::regclass) </code></pre><p>tapi tidak ada yang bekerja. bagaimana saya bisa menggunakan <code>currval()</code> untuk mendapatkan id yang dimasukkan terakhir?</p>
<p>jika anda membuat kolom sebagai <code>serial</code> postgresql secara otomatis membuat urutan untuk itu.</p><p>nama urutannya dibuat secara otomatis dan selalu tablename\_columnname\_seq, dalam kasus anda urutannya adalah nama <code>names\_id\_seq</code>.</p><p>setelah memasukkan ke dalam tabel, anda dapat memanggil <code>currval()</code> dengan nama urutan itu:</p><pre><code>postgres=&gt; create table names in schema\_name (id serial, name varchar(20)); create table postgres=&gt; insert into names (name) values ('arthur dent'); insert 0 1 postgres=&gt; select currval('names\_id\_seq'); currval  1 (1 row) postgres=&gt; </code></pre><p>alih-alih meng-hardcoding nama urutan, anda juga dapat menggunakan <code>pg\_get\_serial\_sequence()</code> sebagai gantinya:</p><pre><code>select currval(pg\_get\_serial\_sequence('names', 'id')); </code></pre><p>dengan begitu anda tidak perlu bergantung pada strategi penamaan yang digunakan postgres.</p><p>atau jika anda tidak ingin menggunakan nama urutan sama sekali, gunakan <code>lastval()</code></p>
<p>anda bisa mengurutkan kolom ke dalam format menurun dan kemudian hanya mendapatkan nilai dari baris ke-n.</p><p>edit ::</p><p>diperbarui sesuai permintaan komentar.<strong> <em>peringatan</em> </strong>benar-benar belum diuji!</p><pre><code>select dob from (select dob from users order by dob desc) where rowid = 6 </code></pre><p>sesuatu seperti di atas seharusnya bekerja untuk oracle ... anda mungkin harus mendapatkan sintaksnya terlebih dahulu!</p> <p>coba panggil fungsi ini</p><p> <a href="http://api.drupal.org/api/drupal/modules--node--node.module/function/node\_type\_get\_name/7">node\_type\_get\_name ($ node)</a> </p><blockquote> <p>mengembalikan nama jenis simpul dari simpul yang dikirimkan atau string jenis simpul.</p> </blockquote> <p>saya rasa saya menemukannya. sepertinya ada satu langkah tambahan.</p><pre><code>global $user; $user\_full = user\_load($user-&gt;uid); // user\_load(uid) returns the complete array var\_dump($user\_full); </code></pre><p>saya sekarang memiliki akses ke bidang profil khusus saya melalui $ user\_full</p> <p>shmuel613, akan lebih baik untuk memperbarui pertanyaan awal anda daripada menjawab. lebih baik jika ada satu tempat yang berisi pertanyaan lengkap daripada menyebar dalam diskusi.</p><p>jawaban ben masuk akal, kecuali ia tampaknya memiliki 'tidak' di mana ia tidak menginginkannya. menjatuhkan tabel hanya jika<strong> tidak </strong>ada tidak tepat.</p><p>anda memang membutuhkan banyak pernyataan. buat dengan kondisional lalu isi:</p><ol> <li>buat tabel sementara jika tidak ada fubar (id int, name varchar (80))</li> <li>truncate table fubar</li> <li>masukkan ke dalam fubar pilih * dari barfu</li> </ol><p>atau cukup jatuhkan dan buat ulang</p><ol> <li>drop tabel jika ada fubar</li> <li>buat tabel sementara id select fubar, nama dari barfu</li> </ol><p>dengan sql murni itu adalah dua kelas solusi nyata anda. saya suka yang kedua lebih baik.</p><p>(dengan prosedur tersimpan anda bisa menguranginya menjadi satu pernyataan. sesuatu seperti: truncateandpopulate (fubar) tetapi pada saat anda menulis kode untuk truncateandpopulate () anda akan menghabiskan lebih banyak waktu daripada hanya menggunakan sql di atas.)</p> <p>anda bisa mengatur variabel <a href="http://en.wikipedia.org/wiki/internal\_field\_separator">bidang pemisah internal</a> (ifs) variabel, dan kemudian membiarkannya mengurai menjadi array. ketika ini terjadi dalam suatu perintah, maka penugasan ke <code>ifs</code> hanya terjadi pada lingkungan perintah tunggal itu (ke <code>read</code>). ini kemudian mem-parsing input sesuai dengan nilai variabel <code>ifs</code> ke dalam array, yang kemudian dapat kita iterate.</p><pre><code>ifs=';' read -ra addr &lt;&lt;&lt; "$in" for i in "${addr[@]}"; do # process "$i" done </code></pre><p>ini akan mengurai satu baris item yang dipisahkan oleh <code>;</code>, mendorongnya ke dalam array. hal-hal untuk memproses seluruh <code>$in</code>, setiap kali satu baris input dipisahkan oleh <code>;</code>:</p><pre><code> while ifs=';' read -ra addr; do for i in "${addr[@]}"; do # process "$i" done done &lt;&lt;&lt; "$in" </code></pre> <p>perintah <kbd>d</kbd><kbd>w</kbd> akan menghapus dari posisi kursor saat ini ke awal karakter word berikutnya. perintah <kbd>d</kbd><kbd>$</kbd> (perhatikan, itu tanda dolar, bukan tanda 's') akan dihapus dari posisi kursor saat ini ke akhir baris saat ini. <kbd>d</kbd> adalah sinonim untuk <kbd>d</kbd><kbd>$</kbd>.</p> data setelah diurutkan:

 

menentukan kuartil bawah:

 

menentukan kuartil atas:

 

menentukan hamparan (jangkauan interkuartil): <p>jika saya memahami pertanyaan anda, saya pikir anda dapat menggunakan modul khusus (dalam contoh ini, nama modulnya adalah <code>test\_remove\_field</code>) dan sertakan kode berikut:</p><pre><code>function test\_remove\_field\_form\_alter(&amp;$form, &amp;$form\_state) { if (arg(0) == 'node' &amp;&amp; arg(1) == 'add') { $form['field\_test']['#access'] = 0; } } </code></pre><p>catatan: ingat itu <code>field\_test</code> harus nama bidang anda masing-masing.</p> <p>dalam istilah yang paling sederhana, <code>git pull</code> melakukan <code>git fetch</code> diikuti oleh <code>git merge</code>.</p><p>anda dapat melakukan <code>git fetch</code> kapan saja untuk memperbarui cabang pelacakan jarak jauh anda di bawah <code>refs/remotes/&lt;remote&gt;/</code>.</p><p>operasi ini tidak pernah mengubah cabang lokal anda di bawah <code>refs/heads</code>, dan aman dilakukan tanpa mengubah copy pekerjaan anda. saya bahkan pernah mendengar ada orang yang menjalankan <code>git fetch</code> secara berkala di pekerjaan cron di latar belakang (walaupun saya tidak akan merekomendasikan melakukan ini).</p><p><code>git pull</code> adalah apa yang akan anda lakukan untuk memperbarui cabang lokal dengan versi jarak jauhnya, sambil juga memperbarui cabang pelacakan jarak jauh anda yang lain.</p><p>dokumentasi git: <a href="http://git-scm.com/docs/git-pull"><strong>git pull</strong></a> </p> <p>akhirnya, inilah bagaimana saya mengadaptasi dan menempelkan saran dari @tostinni, @stefgosselin, @ uwe999 jawaban dan lainnya:</p><pre><code>/** * implementation of hook\_form\_alter(). */ function custom\_module\_form\_alter(&amp;$form, &amp;$form\_state, $form\_id) { switch ($form\_id) { case 'my\_form\_id': // add custom validation callback $form['#validate'][] = 'custom\_module\_my\_form\_id\_validate'; break; ... default: break; } } </code></pre><p>maka semua fungsi yang saya implementasikan di:</p><pre><code>/** * implementation of hook\_form\_form\_id\_alter */ function custom\_module\_my\_form\_id\_validate(&amp;$form, &amp;$form\_state) { //retrieve the value for your field $value = $form\_state['values']['field\_my\_field']['und'][0]['value']; //execute a count query to see if there's other similar values. $query = new entityfieldquery; $query-&gt;entitycondition('entity\_type', 'field\_collection\_item') -&gt;fieldcondition('field\_my\_field', 'value', $value) -&gt;count(); $count = $query-&gt;execute(); if ($count &gt; 0) { form\_set\_error('field\_my\_field', 'unique field value is already used.'); } } </code></pre><p>saya sudah mencoba bekerja dengan <code>entity\_metadata\_wrapper</code> tapi sayangnya saya belum berhasil.</p><p>terima kasih atas jawaban anda.</p>