Nasıl veritabanı girişlerinin dönen bir kategori kayıtları gelip sırayla atanır?

3 Cevap php

Ben bir web sitesinden girdileri alır bir tablo var ve bu kayıtlar veritabanına gitmek gibi, herhangi bir zamanda değiştirilebilir bir kategori listesinde bir sonraki kategori tayin edilmesi gerekir.

Bu nedenle ben kimlikleri 1, 6, 11, 16 5 ilk kategori haritalama için gibi basit bir şey yapamaz.

Şu anda muhtemelen kategoriler listesinde okuma ve son eklenen birinin değerini kontrol, ve sonra yeni rekor sonraki kategoriyi vererek kabul ettik, ama iki istekleri aynı anda gelirsen, ben potansiyel atamak olabilir düşünün ikisini aynı kategorkimlike ziyade sırayla.

Yani, düşünme benim şimdiki yuvarlak şudur:

  • tabloları kilitlemek (kategoriler ve kayıtlar)
  • kayıtlarına yeni satır eklemek
  • yeni satırın kimliği almak
  • insertl önceki satırı seçin (auto_inc_name azalan 0 tarafindan kullanarak, 1)
  • önceki satırın kategorisini alır ve kedi listeden sonraki kapmak
  • Yeni eklenen satır güncellemek
  • Tabloyu kilkimlikini

Ben bu doğru çalışacaktır% 100 emin değilim, ve bunu yapmak için daha kolay bir yolu belki var, bu yüzden soruyorum:

A. Will this work as I described in the original problem? B. Do you have a better/easier way to do this?

Teşekkürler ~

3 Cevap

Ben bu şekilde basit ... Sadece "last_category" bir giriş, (imzasız tinyint not_null) ile bir tablo yapmak yapardı. Eğer bir ekleme yapmak her zaman sadece bu değeri artırmak ve gerektiğinde sıfırlamak.

Ben senin sorunu anlamak emin değilim, ama anladığım kadarıyla gibi bir şey istiyorum

category | data
-----------------
0        | lorem
1        | ipsum
....     | ...
4        | dolor
0        | sit
...      | ...

Nasıl eşsiz bir auto_increment sütun ve kategori MOD 5 Bu sütunun olalım sahip hakkında?

% 100 doğru davranış gerekiyorsa tüm uçlar düzgün sıraya böylece yerde bir şey kilitlemek gerekir gibi geliyor. Eğer veri eklemek için tek bir SQL ifadesini kullanırsanız kategori tablo kilitleme önlemek mümkün olabilir. Ben MySQL farklıdır nasıl emin değilim ama Oracle ben bunu yapabilirsiniz:

insert into my_table (id, col1, col2, category_id)
select :1, :2, :3, :4, c.id -- :1, :2, etc are bind variables. :1 corresponds to the ID.
from 
  (select 
      id, -- category id
      count(*) over (partition by 1) cnt, -- count of how many categories there are
      row_number() over (partition by 1 order by category.id) rn -- row number for current row in result set
   from category) c
where c.rn = mod(:1, cnt)

Bir açıklamada bu şekilde ben o anda var kategorilere dayalı bir sonraki kayıt eklemek. Eğer taahhüt kadar insert otomatik my_table tablo kilitler. Bu ID modülü dayalı kategoriyi kapmak. This link mysql bir satır numarası yapmak için nasıl gösterir. Ben emin değilim count(*) gerektirir group by mysql içinde; oracle o yüzden ben tüm sonuç kümesini saymak yerine bir bölümü kullanılır gelmez.