【问题标题】:How to insert a unique ID into each SQLite row?如何在每个 SQLite 行中插入唯一 ID?
【发布时间】:2012-02-18 14:57:31
【问题描述】:

我有以下 SQLite 代码。如何在每一行中插入一个自动生成的唯一 ID?

    tx.executeSql('DROP TABLE IF EXISTS ENTRIES');
    tx.executeSql('CREATE TABLE IF NOT EXISTS ENTRIES (id unique, data)');

    tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (1, "First row")');
    tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (2, "Second row")');

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    您可以将id 定义为auto increment column

    create table entries (id integer primary key autoincrement, data)
    

    正如 MichaelDorner 所指出的,SQLite documentation 表示 integer primary key 做同样的事情并且速度稍快一些。该类型的列是rowid 的别名,即behaves like an autoincrement column

    create table entries (id integer primary key, data)
    

    这种行为是隐含的,可能会让没有经验的 SQLite 开发人员措手不及。

    【讨论】:

    • 请注意,“AUTOINCREMENT 关键字会带来额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是严格需要,应避免使用。通常不需要。” (sqlite.org/autoinc.html)
    • @MichaelDorner:谢谢,有趣,我已经更新了答案。
    • 注意它必须integer而不是int在带有PDO的PHP中,否则它不会自动设置id。
    • 如果你有一堆不同的字符串要存储,并且必须避免自动增量,你会怎么做?考虑到这些字符串会在不同的时间重复多次(外键情况)
    • 关于是否使用 AUTOINCREMENT 的决定应该是您是否希望重用给定表中的键。例如,如果 key=7 的行已被删除,您想使用(现在可用的)7 作为键插入下一行吗?如果你不想重用它,那么你需要使用 AUTOINCREMENT
    【解决方案2】:

    这是我使用的语法。

     id INTEGER PRIMARY KEY AUTOINCREMENT,
    

    根本不为自增列提供数据

     tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (NULL, "First row")');
    

    甚至更简单

     tx.executeSql('INSERT INTO ENTRIES (data) VALUES ("First row")');
    

    【讨论】:

      【解决方案3】:

      autoincrement 是你的好友。

      CREATE TABLE IF NOT EXISTS ENTRIES (id integer primary key autoincrement, data);
      INSERT INTO ENTRIES (data) VALUES ("First row");
      INSERT INTO ENTRIES (data) VALUES ("Second row");
      

      然后:

      > SELECT * FROM ENTRIES;
      1|First row
      2|Second row
      

      【讨论】:

        【解决方案4】:

        对于 INSERT,最好为相应的自动增量值的问号占位符提供一个“null”值。

         tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (?, ?)', [null, "First row"]);
        

        【讨论】:

          【解决方案5】:

          这对我来说非常有效

          c.execute('INSERT INTO WEBSITES (url) VALUES (?)', [url])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-03
            • 2012-02-12
            • 1970-01-01
            • 2010-10-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多