Preparing a MySQL INSERT/UPDATE statement with DEFAULT values

后端 未结 4 1688
谎友^
谎友^ 2020-12-06 10:38

Quoting MySQL INSERT manual - same goes for UPDATE:

Use the keyword DEFAULT to set a column explicitly to its default value. This makes it easier to w

4条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-06 11:08

    The only "workaround" I know for this is to use Coalesce() and Default(fieldname)

    E.g.

    $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";
    }
    

    prints

    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
    

提交回复
热议问题