---
title: "Important: Contract relation columns are NOT NULL now"
manual: "Academic Profiles"
version: "main"
source: "Changelog/3.0/Important-ContractRelationColumnsAreNotNullable.rst"
rendered: "2026-10-02T20:47:49+00:00"
---

# Important: Contract relation columns are NOT NULL now {#important-1788195400}

## Description {#description}

The `organisational_unit`, `function_type` and `location` columns
of `tx_academicpersons_domain_model_contract` were nullable integer columns,
and their TCA select fields used an empty string (respectively `null`) as the
value of their "please select" item. PostgreSQL rejects an empty string as an
integer value, so on that DBMS saving a contract with one of these selects empty
failed — and so did every DataHandler `localize` of a contract whose source
row held `NULL` in one of them, which the reworked translation
synchronisation runs into. MySQL, MariaDB and SQLite coerce the empty string to
`0` silently, which is why the defect only surfaced on PostgreSQL.

Both sides now follow the core convention for optional single-value relation
selects: the empty item value is `0`, the field default is `0`, and the
three columns are `int(11) unsigned DEFAULT '0' NOT NULL`.

## Impact {#impact}

The database analyzer will suggest altering the three columns. On installations
where existing rows hold `NULL` in one of them — rows created before this
version and never saved since — the `ALTER TABLE` fails on PostgreSQL and on
MySQL in strict mode until those values are updated to `0`:

```sql
UPDATE tx_academicpersons_domain_model_contract
    SET organisational_unit = 0 WHERE organisational_unit IS NULL;
UPDATE tx_academicpersons_domain_model_contract
    SET function_type = 0 WHERE function_type IS NULL;
UPDATE tx_academicpersons_domain_model_contract
    SET location = 0 WHERE location IS NULL;
```

An empty relation is stored as `0` from now on; Extbase resolves both
`NULL` and `0` to an unset relation, so rendering is unaffected.

## Affected Installations {#affected-installations}

Every installation — the schema change applies everywhere. Functionally broken
before this change: PostgreSQL installations only.
