You are here

protected function Schema::createTableSql in Drupal 10

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/modules/mysql/src/Driver/Database/mysql/Schema.php \Drupal\mysql\Driver\Database\mysql\Schema::createTableSql()

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

Parameters

$name: The name of the table to create.

$table: A Schema API table definition array.

Return value

An array of SQL statements to create the table.

File

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

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,
  ];
}