NEW

The wait is over. SurrealDB 3.0 is here!

Learn more
Course content preview

14: Schemafull and schemaless

Our database now has two schemaless tables.

INFO FOR DB;

Response

{
accesses: {},
analyzers: {},
configs: {},
functions: {},
models: {},
params: {},
tables: {
place: 'DEFINE TABLE place TYPE ANY SCHEMALESS PERMISSIONS NONE',
town: 'DEFINE TABLE town TYPE ANY SCHEMALESS PERMISSIONS NONE'
},
users: {}
}

Schemaless means that the table is free to accept any sort of data that we give it. If the tables were SCHEMAFULL, they would have been much more strict. A schemafull table will ignore input for any field except id unless they are defined in advance.

DEFINE TABLE schemafull_town SCHEMAFULL;
-- schemafull_town only has one defined field
DEFINE FIELD population ON schemafull_town TYPE number;

-- So the query succeeds, but 'name' data is ignored
CREATE schemafull_town SET name = "Riverdale", population = 75000;
REMOVE TABLE schemafull_town;

CREATE query output

[
{
id: schemafull_town:q9olode057qz1vdzruuv,
population: 75000
}
]

The INFO FOR command works for other items too, like tables.

INFO FOR TABLE place;
INFO FOR TABLE town;

Response

-------- Query --------

{
events: {},
fields: {},
indexes: {},
lives: {},
tables: {}
}

-------- Query --------

{
events: {},
fields: {},
indexes: {},
lives: {},
tables: {}
}

The empty input shows that place and town are schemaless, without any defined fields. That means that we could create a town with a name that is a completely different type, like a number.

CREATE town SET name = 9999.999999;

Response

[
{
id: town:x1hy1y4d21x5dlhndprc,
name: 9999.999999f
}
]

We don't want people to create towns with names like 9999.999999, so we will create a schema on the next page to ensure that this won't happen. Let's first delete this unwanted town.

DELETE town WHERE name = 9999.999999 RETURN BEFORE;

Response

[
{
id: town:2ciozta7zj7b8yvqfkpm,
name: 9999.999999f
}
]