(Mysql, php) verileri takmadan önce auto_increment alan değerini almak nasıl?

10 Cevap php

Ben depolama sunucusuna görüntü dosyasını yolluyorum. Yüklemeden önce ben bunun (örneğin, 12345_filename.jpg) in AUTOINCREMENT DEĞER içeren dosya, oluşturmak gerekir.

Nasıl DB takmadan önce değiştirmemesi değer alabilir?

Ben sadece bir çözüm görmek

  1. boş bir satır eklemek
  2. Bu değiştirmemesi bir değer olduğunu olsun
  3. bu satırı silin
  4. s.1 gelen değiştirmemesi değerini kullanarak gerçek veriler ile satır eklemek

Başka bir çözüm var mı?

Teşekkür ederim

10 Cevap

Değiştirmemesi değeri ekleme yapılır veritabanı kendisi tarafından oluşturulur; hangi gerçek ekleme sorgusu yapmadan önce almak anlamına gelir.

Eğer önerilen çözüm sık sık kullanılan bir değil - olurdu:

  • bazı yarı-boş veri eklemek
  • oluşturulan oldu değiştirmemesi değeri olsun
  • Bu değiştirmemesi değeri kullanarak, hesaplamalar yapmak
  • Daha önce güncellenmektedir hangi satır tanımlamak için update sorgu where fıkrasında, üretilen AUTOINCREMENT kullanarak - yerine tam / yeni veri koymak için satır güncellemek.

Tabii ki, bir güvenlik önlemi olarak, tüm bu operasyonlar bir işlem olarak yapılacak olan (to ensure a "all or nothing" behavior)


As pseudo-code :

begin transaction
insert into your table (half empty values);
$id = get last autoincrement id
do calculations
update set data = full data where id = $id
commit transaction

Çözümü yoktur. Eğer yeni bir satır, full stop taktığınızda otomatik artış değeri olsun. Sonraki otomatik artış değeri bir yüksek olacaktır beri takma ve silme, yardımcı olmaz. Aynı anda veritabanına konuşurken muhtemelen birden fazla müşteri için yapmak, bunu tahmin ve gerçek uç arasında artırılır olabilir beri sonraki değeri tahmin edemez.

Farklı bir çözüm bulun. Bir satır eklemek ve daha sonra güncellemek veya otomatik artış id bağımsızdır dosya için bir kimliği oluşturmak ya.

de, bu deneyin:

$query = "SHOW TABLE STATUS LIKE 'tablename'";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
var_dump($row);

çıktı:

array(18) {
[...]
["Auto_increment"]=> string(4) "3847"
[...]
}

Bu sonraki auto_increment kimlik olacaktır.

@ Pascal Martin iyi bir nokta yapar. Bu gibi durumlarda, ben şahsen (aynı zamanda güvenlik nedenleriyle web uygulamaları ve web sitelerinde "kamu" Kimlik olacak) rastgele, 16 haneli kimliğini içeren, başka bir kimlik sütun eklemek istiyorum. Bu rasgele kimlik, sizin uygulamanızda önceden ayarlanmış onunla çalışmak ve kayıt aslında oluşturulduğunda sonra ayarlayabilirsiniz.

INSERT INTO kayıtları1 (ad, soyad) değerleri (INFORMATION_SCHEMA.TABLES 'merhaba', seçeneğini auto_increment burada TABLE_NAME = 'kayıtları1' ve table_schema = 'test')

Kimliği Birincil Anahtar ve nerede Otomatik sayı sütun.

Bir postgresql dizisi gibi, sadece bir sayaç gibi ayrı bir tablo kullanmak, ve ana tablo (lar) içinde AUTO_INCREMENT kullanmayın.

Peki bu eski olduğunu, ama bir başkası bunu gerekiyorsa.

Eğer böyle bir şey yapabileceğini nereye "information_schema" masada bu tür bir değer alabilirsiniz

select AUTO_INCREMENT from TABLES where TABLE_SCHEMA = 'You're Database' and TABLE_NAME = 'Table Name'

Yani Meta Verilerin bu tür her zaman ınformatıon_schema saklanır.

Bu işlev yararlıdır. Tetikleyici bu işlevi kullanın.

DELIMITER @@

CREATE DEFINER=`root`@`%`
FUNCTION `fn_autoincrementvalue`(`pTableName` VARCHAR(50))
    RETURNS int(11)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    RETURN(
             SELECT AUTO_INCREMENT
             FROM   information_schema.`TABLES`
             WHERE  TABLE_SCHEMA  = 'YOUR DATABASE NAME'
             AND    TABLE_NAME    = pTableName
             LIMIT  1
          );
END @@

DELIMITER ;

Kullan mysql_insert_id() son kimliği almak ve sonra + 1

Ben aşağıdaki şekillerde yapabilirsiniz düşünüyorum:

  • in first call (ajax preferably) retrieve the current max value of autoincrement column from db using MAX in query.
  • (değer + 1 yukarıda) _filename.jpg ile kayıt eklemek