【问题标题】:How to create a table with composite primary key in sqlite?如何在sqlite中创建具有复合主键的表?
【发布时间】:2019-09-24 15:31:29
【问题描述】:

我有一个 Android 应用,我只想创建一个包含 2 个主键的表:

public static final String SCRIPT_CREATE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_FOLDER_AUSCULTATION + "("
                + COL_FOLDER_ID + " INTEGER, "
                + COL_REMOTE_FOLDER_ID + " INTEGER PRIMARY KEY, "
                + COL_AUSCULTATION_ID + " INTEGER, "
                + COL_REMOTE_AUSCULTATION_ID + " INTEGER, "
                + COL_CREATE_AT + " INTEGER DEFAULT 0, "
                + COL_MODIFIED_AT + " INTEGER DEFAULT 0, "
                + COL_SYNC_STATUS + " text, "
                + "primary key (" + COL_REMOTE_FOLDER_ID + ", " + COL_REMOTE_AUSCULTATION_ID +")"
                + ");";

但我收到以下错误:

E/SQLiteLog: (1) table "folderAuscultation" has more than one primary key
I/MDEBUG: Error DBHelper.onCreate
android.database.sqlite.SQLiteException: table "folderAuscultation" has more than one primary 
key (code 1): , while compiling: CREATE TABLE IF NOT EXISTS folderAuscultation(folderId 
INTEGER, remoteFolderId INTEGER PRIMARY KEY, IdAuscultation INTEGER, remoteAuscultationId 
INTEGER, createdAt INTEGER DEFAULT 0, modifiedAt INTEGER DEFAULT 0, syncStatus text, primary 
key (remoteFolderId, remoteAuscultationId));
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at 
android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1753)
    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1682)
    at br.com.conectivida.mdconnect.db.DBHelper.onCreate(DBHelper.java:71)
    at br.com.conectivida.mdconnect.db.DBHelper.createTablesIfNotExists(DBHelper.java:136)
    at br.com.conectivida.mdconnect.db.DBHelper.onUpgrade(DBHelper.java:132)

我的语法错了吗?创建这种结构的正确方法是什么?

【问题讨论】:

    标签: android sqlite primary-key composite-key


    【解决方案1】:

    在表定义的前面,您将列COL_REMOTE_FOLDER_ID 定义为主键。因此,当遇到第二个复合主键定义时,您会收到错误消息。删除第一个主键定义,它应该可以工作:

    public static final String SCRIPT_CREATE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_FOLDER_AUSCULTATION + "("
                + COL_FOLDER_ID + " INTEGER, "
                + COL_REMOTE_FOLDER_ID + " INTEGER, "
                + COL_AUSCULTATION_ID + " INTEGER, "
                + COL_REMOTE_AUSCULTATION_ID + " INTEGER, "
                + COL_CREATE_AT + " INTEGER DEFAULT 0, "
                + COL_MODIFIED_AT + " INTEGER DEFAULT 0, "
                + COL_SYNC_STATUS + " TEXT, "
                + "PRIMARY KEY (" + COL_REMOTE_FOLDER_ID + ", " + COL_REMOTE_AUSCULTATION_ID +")"
                + ");";
    

    【讨论】:

    • 哦,当然,我浪费了这么多时间,但我没有注意到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多