TableDefinition

The TableDefinition class lets you define table columns and constraints.

You don’t create instances of this class. Instead, you use the Database create(table:) method:

try db.create(table: "player") { t in // t is TableDefinition
    t.column(...)
}

See https://www.sqlite.org/lang_createtable.html

  • Defines the auto-incremented primary key.

    try db.create(table: "player") { t in
        t.autoIncrementedPrimaryKey("id")
    }
    

    The auto-incremented primary key is an integer primary key that automatically generates unused values when you do not explicitly provide one, and prevents the reuse of ids over the lifetime of the database.

    It is the preferred way to define a numeric primary key.

    The fact that an auto-incremented primary key prevents the reuse of ids is an excellent guard against data races that could happen when your application processes ids in an asynchronous way. The auto-incremented primary key provides the guarantee that a given id can’t reference a row that is different from the one it used to be at the beginning of the asynchronous process, even if this row gets deleted and a new one is inserted in between.

    See https://www.sqlite.org/lang_createtable.html#primkeyconst and https://www.sqlite.org/lang_createtable.html#rowid

  • Appends a table column.

    try db.create(table: "player") { t in
        t.column("name", .text)
    }
    

    See https://www.sqlite.org/lang_createtable.html#tablecoldef

  • Appends a table column defined with raw SQL.

    try db.create(table: "player") { t in
        t.column(sql: "name TEXT")
    }
    
  • Appends a table column defined with an SQL literal.

    Literals allow you to safely embed raw values in your SQL, without any risk of syntax errors or SQL injection:

    // CREATE TABLE player (
    //   name TEXT DEFAULT 'Anonymous'
    // )
    let defaultName = "Anonymous"
    try db.create(table: "player") { t in
        t.column(literal: "name TEXT DEFAULT \(defaultName)")
    }
    
  • Defines the table primary key.

    try db.create(table: "citizenship") { t in
        t.column("citizenID", .integer)
        t.column("countryCode", .text)
        t.primaryKey(["citizenID", "countryCode"])
    }
    

    See https://www.sqlite.org/lang_createtable.html#primkeyconst and https://www.sqlite.org/lang_createtable.html#rowid

  • Adds a unique key.

    try db.create(table: "place") { t in
        t.column("latitude", .double)
        t.column("longitude", .double)
        t.uniqueKey(["latitude", "longitude"])
    }
    

    See https://www.sqlite.org/lang_createtable.html#uniqueconst

  • Adds a foreign key.

    try db.create(table: "passport") { t in
        t.column("issueDate", .date)
        t.column("citizenID", .integer)
        t.column("countryCode", .text)
        t.foreignKey(["citizenID", "countryCode"], references: "citizenship", onDelete: .cascade)
    }
    

    See https://www.sqlite.org/foreignkeys.html

  • Adds a CHECK constraint.

    try db.create(table: "player") { t in
        t.column("personalPhone", .text)
        t.column("workPhone", .text)
        let personalPhone = Column("personalPhone")
        let workPhone = Column("workPhone")
        t.check(personalPhone != nil || workPhone != nil)
    }
    

    See https://www.sqlite.org/lang_createtable.html#ckconst

  • Adds a CHECK constraint.

    try db.create(table: "player") { t in
        t.column("personalPhone", .text)
        t.column("workPhone", .text)
        t.check(sql: "personalPhone IS NOT NULL OR workPhone IS NOT NULL")
    }
    

    See https://www.sqlite.org/lang_createtable.html#ckconst

  • Appends a table constraint defined with raw SQL.

    // CREATE TABLE player (
    //   ...
    //   CHECK (score >= 0)
    // )
    try db.create(table: "player") { t in
        ...
        t.constraint(sql: "CHECK (score >= 0)")
    }
    
  • Appends a table constraint defined with an SQL literal.

    Literals allow you to safely embed raw values in your SQL, without any risk of syntax errors or SQL injection:

    // CREATE TABLE player (
    //   ...
    //   CHECK (score >= 0)
    // )
    let minScore = 0
    try db.create(table: "player") { t in
        ...
        t.constraint(literal: "CHECK (score >= \(minScore))")
    }