yiisoft/yii2 · error · NotSupportedException

SQLite does not support default value constraints.

Error message

SQLite does not support default value constraints.

What it means

yii\db\sqlite\Schema::loadTableDefaultValues() throws NotSupportedException because SQLite has no named default-value constraints to introspect - defaults live per-column inside the CREATE TABLE DDL. The base Schema::getTableDefaultValues() API therefore cannot be honored on SQLite and fails fast with 'SQLite does not support default value constraints.'

Source

Thrown at framework/db/sqlite/Schema.php:205

            if (isset($createTableToken[$firstMatchIndex - 2]) && $createTableToken->matches($pattern, $firstMatchIndex - 2)) {
                $name = $createTableToken[$firstMatchIndex - 1]->content;
            }
            $result[] = new CheckConstraint([
                'name' => $name,
                'expression' => $checkSql,
            ]);
        }

        return $result;
    }

    /**
     * {@inheritdoc}
     * @throws NotSupportedException if this method is called.
     */
    protected function loadTableDefaultValues($tableName)
    {
        throw new NotSupportedException('SQLite does not support default value constraints.');
    }

    /**
     * Creates a query builder for the MySQL database.
     * This method may be overridden by child classes to create a DBMS-specific query builder.
     * @return QueryBuilder query builder instance
     */
    public function createQueryBuilder()
    {
        return Yii::createObject(QueryBuilder::className(), [$this->db]);
    }

    /**
     * {@inheritdoc}
     * @return ColumnSchemaBuilder column schema builder instance
     */
    public function createColumnSchemaBuilder($type, $length = null)
    {

View on GitHub (pinned to 66f00d18a2)

Solutions

  1. Check the driver before introspecting: only call getTableDefaultValues() when Yii::$app->db->driverName !== 'sqlite'.
  2. Read defaults from the column metadata instead: $schema->getTableSchema($table)->columns[$name]->defaultValue works on SQLite.
  3. Restrict schema-diff tooling to columns/indexes/fkeys, which SQLite does expose.
  4. If full parity matters, point the tooling at the production engine rather than a SQLite copy.

Example fix

// before
$defaults = Yii::$app->db->schema->getTableDefaultValues('order');

// after
$defaults = [];
if (Yii::$app->db->driverName !== 'sqlite') {
    $defaults = Yii::$app->db->schema->getTableDefaultValues('order');
} else {
    foreach (Yii::$app->db->schema->getTableSchema('order')->columns as $name => $column) {
        if ($column->defaultValue !== null) {
            $defaults[$name] = $column->defaultValue;
        }
    }
}
Defensive patterns

Strategy: validation

Validate before calling

if (Yii::$app->db->getDriverName() !== 'sqlite') {
    $defaults = Yii::$app->db->schema->getTableDefaultValues('order');
} else {
    // per-column defaults are available from the table schema on SQLite
    $columns = Yii::$app->db->schema->getTableSchema('order', true)->columns;
}

Try / catch

try {
    $defaults = Yii::$app->db->schema->getTableDefaultValues('order');
} catch (\yii\base\NotSupportedException $e) {
    $defaults = []; // SQLite: derive from getTableSchema()->columns instead
}

Prevention

When it happens

Trigger: Calling Yii::$app->db->schema->getTableDefaultValues('order') (directly or through generic schema-inspection code) on a connection whose driverName is 'sqlite'; e.g. migration-diff tools or schema exporters that enumerate every schema facet.

Common situations: Generic schema-inspection/reporting code written against MySQL reused on SQLite; DB-diff or documentation generators that walk all getTable* methods; test harnesses asserting on full schema shape.

Related errors


AI-assisted analysis of yiisoft/yii2@66f00d18a2 (2026-08-17). Data as JSON: /api/errors/eb07d51e6b2cd2e6. Report an issue: GitHub.