PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bidang kenaikan dengan batasan bukan nol dan unik di PostgreSQL 8.3

Tabel lain, dengan beberapa indeks unik:

create table utest(id integer, position integer not null, unique(id, position));
test=# \d utest
      Table "public.utest"
  Column  |  Type   | Modifiers 
----------+---------+-----------
 id       | integer | 
 position | integer | not null
Indexes:
    "utest_id_key" UNIQUE, btree (id, "position")

Beberapa data:

insert into utest(id, position) select generate_series(1,3), 1;
insert into utest(id, position) select generate_series(1,3), 2;
insert into utest(id, position) select generate_series(1,3), 3;

test=# select * from utest order by id, position;
 id | position 
----+----------
  1 |        1
  1 |        2
  1 |        3
  2 |        1
  2 |        2
  2 |        3
  3 |        1
  3 |        2
  3 |        3
(9 rows)

Saya membuat prosedur yang memperbarui nilai posisi dalam urutan yang benar:

create or replace function update_positions(i integer, p integer) 
  returns void as $$
declare
  temprec record;
begin
  for temprec in 
    select * 
      from utest u 
      where id = i and position >= p 
      order by position desc 
  loop
    raise notice 'Id = [%], Moving % to %', 
      i, 
      temprec.position, 
      temprec.position+1;

    update utest 
      set position = position+1 
      where position=temprec.position and id = i;
  end loop;
end;
$$ language plpgsql;

Beberapa tes:

test=# select * from update_positions(1, 2);
NOTICE:  Id = [1], Moving 3 to 4
NOTICE:  Id = [1], Moving 2 to 3
 update_positions 
------------------

(1 row)

test=# select * from utest order by id, position;
 id | position 
----+----------
  1 |        1
  1 |        3
  1 |        4
  2 |        1
  2 |        2
  2 |        3
  3 |        1
  3 |        2
  3 |        3
(9 rows)

Semoga membantu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bilangan bulat di luar jangkauan dan ruang disk yang tersisa terlalu kecil untuk mengonversi id ke bigint dan solusi lainnya

  2. Fungsi Escape untuk ekspresi reguler atau pola LIKE

  3. Elemen kueri dalam array bersarang dari objek json di postgresql 9.4 atau 9.5

  4. Django:izin ditolak ketika mencoba mengakses basis data setelah pemulihan (migrasi)

  5. Bagaimana saya bisa mencegah CakePHP keluar dari data saat disimpan?