function Schema::createTableSql

Same name in this branch
  1. 10 core/modules/sqlite/src/Driver/Database/sqlite/Schema.php \Drupal\sqlite\Driver\Database\sqlite\Schema::createTableSql()
  2. 10 core/modules/pgsql/src/Driver/Database/pgsql/Schema.php \Drupal\pgsql\Driver\Database\pgsql\Schema::createTableSql()
  3. 10 core/lib/Drupal/Core/Database/Schema.php \Drupal\Core\Database\Schema::createTableSql()
Same name and namespace in other branches
  1. 9 core/modules/sqlite/src/Driver/Database/sqlite/Schema.php \Drupal\sqlite\Driver\Database\sqlite\Schema::createTableSql()
  2. 9 core/modules/mysql/src/Driver/Database/mysql/Schema.php \Drupal\mysql\Driver\Database\mysql\Schema::createTableSql()
  3. 9 core/modules/pgsql/src/Driver/Database/pgsql/Schema.php \Drupal\pgsql\Driver\Database\pgsql\Schema::createTableSql()
  4. 8.9.x core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php \Drupal\Core\Database\Driver\sqlite\Schema::createTableSql()
  5. 8.9.x core/lib/Drupal/Core/Database/Driver/mysql/Schema.php \Drupal\Core\Database\Driver\mysql\Schema::createTableSql()
  6. 8.9.x core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php \Drupal\Core\Database\Driver\pgsql\Schema::createTableSql()
  7. 11.x core/modules/sqlite/src/Driver/Database/sqlite/Schema.php \Drupal\sqlite\Driver\Database\sqlite\Schema::createTableSql()
  8. 11.x core/modules/mysql/src/Driver/Database/mysql/Schema.php \Drupal\mysql\Driver\Database\mysql\Schema::createTableSql()
  9. 11.x core/modules/pgsql/src/Driver/Database/pgsql/Schema.php \Drupal\pgsql\Driver\Database\pgsql\Schema::createTableSql()
  10. 11.x core/lib/Drupal/Core/Database/Schema.php \Drupal\Core\Database\Schema::createTableSql()

Generate SQL to create a new table from a Drupal schema definition.

This method should be implemented in extending classes.

@todo This method is called by Schema::createTable on the abstract class, and therefore should be defined as well on the abstract class to prevent static analysis errors. In D11, consider changing it to an abstract method, or to make it private for each driver, and ::createTable actually an abstract method here for implementation in each driver.

Parameters

string $name: The name of the table to create.

array $table: A Schema API table definition array.

Return value

array An array of SQL statements to create the table.

Overrides Schema::createTableSql

File

core/modules/mysql/src/Driver/Database/mysql/Schema.php, line 89

Class

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

Namespace

Drupal\mysql\Driver\Database\mysql

Code

protected function createTableSql($name, $table) {
    $info = $this->connection
        ->getConnectionOptions();
    // Provide defaults if needed.
    $table += [
        'mysql_engine' => 'InnoDB',
        'mysql_character_set' => 'utf8mb4',
    ];
    $sql = "CREATE TABLE {" . $name . "} (\n";
    // Add the SQL statement for each field.
    foreach ($table['fields'] as $field_name => $field) {
        $sql .= $this->createFieldSql($field_name, $this->processField($field)) . ", \n";
    }
    // Process keys & indexes.
    if (!empty($table['primary key']) && is_array($table['primary key'])) {
        $this->ensureNotNullPrimaryKey($table['primary key'], $table['fields']);
    }
    $keys = $this->createKeysSql($table);
    if (count($keys)) {
        $sql .= implode(", \n", $keys) . ", \n";
    }
    // Remove the last comma and space.
    $sql = substr($sql, 0, -3) . "\n) ";
    $sql .= 'ENGINE = ' . $table['mysql_engine'] . ' DEFAULT CHARACTER SET ' . $table['mysql_character_set'];
    // By default, MySQL uses the default collation for new tables, which is
    // 'utf8mb4_general_ci' (MySQL 5) or 'utf8mb4_0900_ai_ci' (MySQL 8) for
    // utf8mb4. If an alternate collation has been set, it needs to be
    // explicitly specified.
    // @see \Drupal\mysql\Driver\Database\mysql\Schema
    if (!empty($info['collation'])) {
        $sql .= ' COLLATE ' . $info['collation'];
    }
    // Add table comment.
    if (!empty($table['description'])) {
        $sql .= ' COMMENT ' . $this->prepareComment($table['description'], self::COMMENT_MAX_TABLE);
    }
    return [
        $sql,
    ];
}

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