首页 文章

多列上的Sqlite主键

提问于
浏览
547

在SQLITE中在多于1列上指定主键的语法是什么?

9 回答

  • 1

    主键字段应声明为非null(这是非标准的,因为主键的定义是它必须是唯一的而不是null) . 但以下是任何DBMS中所有多列主键的良好实践 .

    create table foo
    (
      fooint integer not null
      ,foobar string not null
      ,fooval real
      ,primary key (fooint, foobar)
    )
    ;
    
  • 39

    以下代码在SQLite中创建一个包含 2 column as a primary key 的表 .

    SOLUTION:

    CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
    
  • 0

    从SQLite的3.8.2版开始,显式NOT NULL规范的替代方案是"WITHOUT ROWID"规范:[1]

    NOT NULL is enforced on every column of the PRIMARY KEY
    in a WITHOUT ROWID table.
    

    “没有ROWID”表具有潜在的效率优势,因此考虑的一个不那么冗长的替代方案是:

    CREATE TABLE t (
      c1, 
      c2, 
      c3, 
      PRIMARY KEY (c1, c2)
     ) WITHOUT ROWID;
    

    例如,在sqlite3提示符下: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

  • 148

    换句话说,您还可以创建两列主键 unique 和自动增量键 primary . 就像这样:https://stackoverflow.com/a/6157337

  • 0

    基础:

    CREATE TABLE table1 (
        columnA INTEGER NOT NULL,
        columnB INTEGER NOT NULL,
        PRIMARY KEY (columnA, columnB)
    );
    

    如果您的列是其他表的外键(常见情况):

    CREATE TABLE table1 (
        table2_id INTEGER NOT NULL,
        table3_id INTEGER NOT NULL,
        FOREIGN KEY (table2_id) REFERENCES table2(id),
        FOREIGN KEY (table3_id) REFERENCES table3(id),
        PRIMARY KEY (table2_id, table3_id)
    );
    
    CREATE TABLE table2 (
        id INTEGER NOT NULL,
        PRIMARY KEY id
    );
    
    CREATE TABLE table3 (
        id INTEGER NOT NULL,
        PRIMARY KEY id
    );
    
  • 26

    根据documentation,它是

    CREATE TABLE something (
      column1, 
      column2, 
      column3, 
      PRIMARY KEY (column1, column2)
    );
    
  • 707
    CREATE TABLE something (
      column1 INTEGER NOT NULL,
      column2 INTEGER NOT NULL,
      value,
      PRIMARY KEY ( column1, column2)
    );
    
  • 13

    是 . 但请记住,这样的主键允许两列中的 NULL 值多次 .

    像这样创建一个表:

    sqlite> CREATE TABLE something (
    column1, column2, value, PRIMARY KEY (column1, column2));
    

    现在这没有任何警告:

    sqlite> insert into something (value) VALUES ('bla-bla');
    sqlite> insert into something (value) VALUES ('bla-bla');
    sqlite> select * from something;
    NULL|NULL|bla-bla
    NULL|NULL|bla-bla
    
  • 7

    PRIMARY KEY (id, name) 对我没用 . 添加约束为我完成了这项工作 .

    CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))

相关问题