
# Проверка схемы

Если между снимками меняется схема (добавляются, удаляются или переименовываются столбцы), merql обнаруживает и сообщает об этих различиях. Несовпадение схем не блокирует слияние, но отображается, чтобы вызывающая сторона могла решить, как действовать.

## Обнаружение

`SchemaValidator::validate()` сравнивает наборы столбцов каждой таблицы в снимках базы, нашего и их вариантов. Отчет включает:

- Столбцы, добавленные в нашем варианте (есть в нем, но нет в базе)
- Столбцы, удаленные из нашего варианта (есть в базе, но нет в нем)
- Столбцы, добавленные в их варианте
- Столбцы, удаленные из их варианта

```php
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}
```

## Что обнаруживается

| Изменение | Обнаруживается | Примечания |
|---|---|---|
| Добавление столбца | Да | Отчет формируется отдельно для каждой стороны (наш вариант/их вариант) |
| Удаление столбца | Да | Отчет формируется отдельно для каждой стороны |
| Изменение типа столбца | Нет | Типы сохраняются, но не сравниваются |
| Переименование столбца | Нет | Отображается как добавление и удаление |
| Изменение первичного ключа | Нет | Идентификатор фиксируется при создании снимка |

## Поведение при слиянии

Если столбец есть в одном снимке, но отсутствует в другом, при слиянии его значение считается равным `null`. Это означает:

- Столбец, добавленный в их варианте с ненулевым значением, отображается как `null -> value` (изменение их варианта принимается)
- Столбец, удаленный из их варианта, считается имеющим значение `null` во всех его строках

Слияние выполняется и создает результат. Несовпадения схем носят информационный характер. Перед применением вызывающей стороне следует убедиться, что схема целевой базы данных соответствует объединенным данным.

## Доступ к сведениям о несовпадениях

Несовпадения схем доступны как в `ThreeWayMerge` (через `schemaMismatches()`), так и в `MergeResult` (через `schemaMismatches()` и `hasSchemaMismatches()`). Они сохраняются при выполнении `ConflictResolver::resolve()`.

```php
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}
```
