Skip to main content

Creating a table

Define a set of columns, their types, and constraints for a table.


A table is a structure of rows and columns that gets generated through a single top-level statement:

CREATE TABLE table_name(
column1 datatype constraint,
column2 datatype constraint,
...
);

The general flow is to start with the CREATE TABLE keywords, pass the (optional) table "prefix," and define columns plus constraints. You don't have to use a table prefix nor any constraints, but you'll often want to.

tip

Review the supported data types, which includes INT,INTEGER, TEXT, and BLOB.

Column definitions

Every CREATE TABLE statement should include one or more column definitions (a column name and type), optionally followed by a list of table constraints (e.g., column1 datatype constraint could be something like my_col INT NOT_NULL). Column names must also start with a letter, followed by any combination of (zero or more) letters, numbers, and/or underscores.

For example, we can create a table with two columns that contain a number and string:

CREATE TABLE my_table(
id INT,
val TEXT
);

Constraints

You can attach column (or certain table) constraints to fine tune how data can be represented. This includes the following:

ConstraintDefinitionColumn constraint?Table constraint?
PRIMARY KEYA unique value to identify a row—at most, one primary key can be assigned to a table, which can be added to a single column or a grouping / list of columns.YesYes
NOT NULLEnsure that a value is not null.YesNo
UNIQUEEnsure that a value is unique within the column.YesNo
CHECKPerform a check of a value against an expression.YesYes
DEFAULTDefine a default value for a column (e.g., my_col TEXT DEFAULT 'val1').YesNo

As with the column constraints, a table constraint follows the format column datatype constraint within the schema portion of a CREATE TABLE statement.

  • Primary keys
    • You can create a table with a PRIMARY KEY constraint, which, under the hood, is a combination of NOT NULL and UNIQUE. A primary key must uniquely identify a row by its column or set of columns, such id INTEGER PRIMARY KEY.
    • For a table constraint, place this at the end of a schema definition using a combination of columns like PRIMARY KEY (col1, col2).
  • Non-null values
    • Use a definition of val TEXT NOT NULL to ensure values are non-empty for a specific column.
    • A NOT NULL constraint can help with having "required" data constraints.
  • Unique values
    • Similarly, something like val TEXT UNIQUE will only allow unique values to be inserted into a specific column.
    • This is useful if you're trying to make sure there aren't duplicate entries.
  • Check against an expression
    • You want can make sure a column's values meet some criteria that use typical arithmetic operators (>, <,>=, <=, !=, ==) plus AND or OR. For example, a column constraint might look like id INT CHECK (id > 0).
    • For a table constraint, this follows a similar pattern. Perhaps, you'd like to perform some other table checks with something like CHECK (id > 0 AND val != 2), which would be the last item in the schema definition list.
  • Default values
    • Setting a default value is pretty straightforward—for example, val TEXT DEFAULT 'message' would set the value to message if nothing is provided upon row insertion.
    • There might be times when you want something to exist as a placeholder and where you later update that value, when needed—the DEFAULT constraint helps with this.

The following shows a simple example with a few added column and table constraints:

CREATE TABLE my_table(
id INT DEFAULT 0,
val TEXT NOT NULL,
PRIMARY KEY (id, val)
);
note

If you use the INTEGER type along with PRIMARY KEY, you unlock a special feature for auto-incrementing a row's data automatically. Check out the docs on auto-incrementing values for more specifics.

Altering an existing table

You can alter the structure of a table with an ALTER TABLE statement. There are 3 kinds of operations supported:

  • Renaming an existing column
ALTER TABLE my_table RENAME COLUMN val to v;
  • Adding a new column
ALTER TABLE my_table ADD COLUMN int_val INTEGER;
  • Dropping a column
ALTER TABLE my_table DROP COLUMN val;

Up to now, only the table owner can execute ALTER TABLE statements. If you want your table to have an immutable structure, you'd have to transfer it to a burner address.

For more details, check the ALTER TABLE specification.