DEFAULT değerler ile MySQL INSERT / UPDATE deyimi hazırlanıyor

4 Cevap php

MySQL INSERT kılavuzu alıntı - Aynı GÜNCELLEME için de geçerli:

Varsayılan değer açıkça bir sütun ayarlamak için anahtar kelime varsayılan kullanın. Bu daha kolay o tablodaki her sütun için bir değer içermez eksik DEĞERLERİ listesini yazılmasını önlemek sağlar çünkü, birkaç sütuna ama tüm değerlerini atamak INSERT ifadeleri yazmak için yapar. Aksi takdirde, VALUES listesinde her değere karşılık gelen sütun adlarının listesini yazmak olurdu.

Yani kısaca ben yazarsam

INSERT INTO table1 (column1,column2) values ('value1',DEFAULT);

Varsayılan değer olarak ayarlanmış column2 ile yeni bir satır - her ne olabilir - sokulur.

Ancak ben hazırlamak ve PHP bir deyimini yürütmek:

$statement = $pdoObject->
    prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));

Yeni satır, metin değeri olarak 'default' içerecektir - sütun metin değerlerini depolamak mümkün ise.

Şimdi PDO bir soyutlama katmanı yazdım (ben bunu gerekli) ve bu soruna almak için bir tanıtmak düşünüyor yaşıyorum

const DEFAULT_VALUE = "randomstring";

Yani bu gibi ifadeler yürütebilir:

$statement->execute(array('value1',mysql::DEFAULT_VALUE));

Ve sonra yöntemde o gelmez bazı self::DEFAULT_VALUE, buna göre hareket eşitse bağlı gönderilir ve değerler üzerinden gitmek istiyorum bağlayıcı.

Bunu yapmak için daha iyi bir yolu var eminim. Başkası benzer durumlarla karşılaştı?

4 Cevap

Bunun için biliyorum sadece "geçici çözüm" Coalesce() ve Default(fieldname) kullanmak için

Örneğin

$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->exec("
  CREATE TEMPORARY TABLE foo (
    id int auto_increment,
    x int NOT NULL DEFAULT 99,
    y DATETIME NOT NULL DEFAULT '2010-03-17 01:00:00',
    z varchar(64) NOT NULL DEFAULT 'abc',
    primary key(id)
  )
");


$stmt = $pdo->prepare('
  INSERT INTO
    foo
    (x,y,z)
  VALUES
    (
      Coalesce(:x, Default(x)),
      Coalesce(:y, Default(y)),
      Coalesce(:z, Default(z))
    )
');
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);


$testdata = array(
  array(null, null, null),
  array(1, null, 'lalala'),
  array(null, '2009-12-24 18:00:00', null)
);
foreach($testdata as $row) {
  list($x,$y,$z) = $row;
  $stmt->execute();
}
unset($stmt);
foreach( $pdo->query('SELECT id,x,y,z FROM foo', PDO::FETCH_NUM) as $row) {
  echo join(', ', $row), "\n";
}

baskılar

1, 99, 2010-03-17 01:00:00, abc
2, 1, 2010-03-17 01:00:00, lalala
3, 99, 2009-12-24 18:00:00, abc

Bu değiştirmeyi deneyin:

$statement = $pdoObject->
    prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));

Buna:

$statement = $pdoObject->
    prepare("INSERT INTO table1 (column1,column2) values (?,DEFAULT)");
$statement->execute(array('value1'));

Bu orijinal kod bu verecektir gibi geliyor bana:

INSERT INTO table1 (column1,column2) values ('value1','DEFAULT')

Benim kod bu vermelidir:

INSERT INTO table1 (column1,column2) values ('value1',DEFAULT)

Ben VolkerK cevap yanıtlarken çalıştı, ama nasıl bulamadı. : (Ben bütün bu tür yeniyim.

Her neyse, ben onun COALESCE fikri ile conjuction kullanmak için mysql işlevi yarattı

CREATE FUNCTION NULLDEFAULT(colname VARCHAR(64), tablename VARCHAR(64), dbname VARCHAR(64)) RETURNS longtext DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE retval longtext;
    SELECT
        COLUMN_DEFAULT INTO retval 
    FROM
        information_schema.COLUMNS
    WHERE
        TABLE_NAME = tablename
    AND
        COLUMN_NAME = colname
    AND
        TABLE_SCHEMA = dbname;

    RETURN retval;
END

Bu gibi kullanabilirsiniz:

$stmt = $pdo->prepare("
  INSERT INTO
    foo
    (x,y,z)
  VALUES
    (
      Coalesce(:x, NULLDEFAULT('x', 'foo', 'database')),
      Coalesce(:y, NULLDEFAULT('y', 'foo', 'database')),
      Coalesce(:z, NULLDEFAULT('z', 'foo', 'database'))
    )
");

Bu sütun varsayılan değeri yok ise boş dönecektir, ve "Sütun varsayılan değeri yok" Hata tetikleyecek değil.

Tabii ki bunu veritabanı parametre gerektirmeyen için değiştirebilir

i hiçbir tırnak ile bir boş göndermek böylece verilen değerin türünü belirtebilirsiniz bindValue için parametrelerde vardır böylece PDO tarafından kaçtı ve o PDO :: PARAM_NULL olacak çünkü String 'default' yazılı olduğunu düşünüyorum ; ve sonra varsayılan değerler koymak olacak, ama yürütmek ile bağlama zaman benzer parametreleri varsa emin değilim

  if(is_int($param)){$pdoParam = PDO::PARAM_INT;}
      elseif(is_bool($param)){$pdoParam = PDO::PARAM_BOOL;}
      elseif(is_null($param)){ $pdoParam = PDO::PARAM_NULL;}
      elseif(is_string($param)){$pdoParam = PDO::PARAM_STR;}
                                    else{$pdoParam = FALSE;}
              $this->_query->bindValue($k,$param,$pdoParam);