function Connection::nextId

Same name in this branch
  1. 8.9.x core/tests/fixtures/database_drivers/custom/fake/Connection.php \Drupal\Driver\Database\fake\Connection::nextId()
  2. 8.9.x core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php \Drupal\Core\Database\Driver\sqlite\Connection::nextId()
  3. 8.9.x core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php \Drupal\Core\Database\Driver\pgsql\Connection::nextId()
  4. 8.9.x core/lib/Drupal/Core/Database/Connection.php \Drupal\Core\Database\Connection::nextId()
Same name in other branches
  1. 9 core/modules/sqlite/src/Driver/Database/sqlite/Connection.php \Drupal\sqlite\Driver\Database\sqlite\Connection::nextId()
  2. 9 core/modules/mysql/src/Driver/Database/mysql/Connection.php \Drupal\mysql\Driver\Database\mysql\Connection::nextId()
  3. 9 core/modules/pgsql/src/Driver/Database/pgsql/Connection.php \Drupal\pgsql\Driver\Database\pgsql\Connection::nextId()
  4. 9 core/tests/fixtures/database_drivers/custom/fake/Connection.php \Drupal\Driver\Database\fake\Connection::nextId()
  5. 9 core/lib/Drupal/Core/Database/Connection.php \Drupal\Core\Database\Connection::nextId()
  6. 10 core/modules/sqlite/src/Driver/Database/sqlite/Connection.php \Drupal\sqlite\Driver\Database\sqlite\Connection::nextId()
  7. 10 core/modules/mysql/src/Driver/Database/mysql/Connection.php \Drupal\mysql\Driver\Database\mysql\Connection::nextId()
  8. 10 core/modules/pgsql/src/Driver/Database/pgsql/Connection.php \Drupal\pgsql\Driver\Database\pgsql\Connection::nextId()
  9. 10 core/tests/fixtures/database_drivers/custom/fake/Connection.php \Drupal\Driver\Database\fake\Connection::nextId()
  10. 10 core/lib/Drupal/Core/Database/Connection.php \Drupal\Core\Database\Connection::nextId()

Overrides Connection::nextId

File

core/lib/Drupal/Core/Database/Driver/mysql/Connection.php, line 580

Class

Connection
MySQL implementation of \Drupal\Core\Database\Connection.

Namespace

Drupal\Core\Database\Driver\mysql

Code

public function nextId($existing_id = 0) {
    $new_id = $this->query('INSERT INTO {sequences} () VALUES ()', [], [
        'return' => Database::RETURN_INSERT_ID,
    ]);
    // This should only happen after an import or similar event.
    if ($existing_id >= $new_id) {
        // If we INSERT a value manually into the sequences table, on the next
        // INSERT, MySQL will generate a larger value. However, there is no way
        // of knowing whether this value already exists in the table. MySQL
        // provides an INSERT IGNORE which would work, but that can mask problems
        // other than duplicate keys. Instead, we use INSERT ... ON DUPLICATE KEY
        // UPDATE in such a way that the UPDATE does not do anything. This way,
        // duplicate keys do not generate errors but everything else does.
        $this->query('INSERT INTO {sequences} (value) VALUES (:value) ON DUPLICATE KEY UPDATE value = value', [
            ':value' => $existing_id,
        ]);
        $new_id = $this->query('INSERT INTO {sequences} () VALUES ()', [], [
            'return' => Database::RETURN_INSERT_ID,
        ]);
    }
    $this->needsCleanup = TRUE;
    return $new_id;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.