Does REMOVE FIELD delete the data in SurrealDB?
REMOVE FIELD on an existing table
Warning: the statement succeeds, then writes fail, access changes, or the table is held up.
What happens
Observed on SurrealDB 3.0.2: after REMOVE FIELD legacy ON user on a SCHEMAFULL table, SELECT still returns legacy = 1, and UPDATE user:1 SET email = 'b' fails with "Found field 'legacy', but no such field exists". Unsetting the field first, then removing it, leaves the record writable.
Why it is dangerous on a populated table
SurrealDB checks a schema change against new writes, not the records already stored, so an empty table hides it: on a populated one every old record is a write waiting to fail, and whole-table work runs for the length of the table in one transaction.
Fires on
REMOVE FIELD legacy_flag ON TABLE user;The safe pattern
Release code that no longer uses the field, strip it from the records, and remove the definition last. The rule stays silent when the same migration unsets the field first.
UPDATE user UNSET legacy_flag WHERE legacy_flag IS NOT NONE;
REMOVE FIELD legacy_flag ON TABLE user;Fixtures
The rule ships with these files and the test suite runs them on every change: the first set must fire, the second must stay silent.
Fires (2)
REMOVE FIELD legacy_flag ON TABLE user;REMOVE FIELD IF EXISTS legacy_flag ON user;Stays silent (2)
DEFINE TABLE scratch SCHEMAFULL;
DEFINE FIELD note ON TABLE scratch TYPE string;
REMOVE FIELD note ON TABLE scratch;UPDATE user UNSET legacy_flag WHERE legacy_flag IS NOT NONE;
REMOVE FIELD legacy_flag ON TABLE user;How to check locally
SurrealDB support is in beta: this rule runs locally in the free CLI over .surql migrations, static only, and not in the hosted service yet. No install, nothing leaves your machine:
npx bolvrk check migration.surql --engine=surrealdb