【问题标题】:Android Sqlite Foreign Key Unknwon ColumnAndroid Sqlite 外键未知列
【发布时间】:2016-12-28 08:20:33
【问题描述】:

我在我的数据库中添加了外键。我从我的设备重新安装了该应用程序并增加了数据库版本。这是我的代码:

常量:private static final String COLUMN_K_ID = "kid";

创建表:

  private static final String CREATE_TABLE_ZIELE_KOERPER =  "CREATE TABLE " + TABLE_ZIELE_KOERPER + "(" +
            COLUMN_ID           + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_OPTION       + " INTEGER, "   +
            COLUMN_TENDENZ      + " INTEGER );";

    private static final String CREATE_TABLE_ZIELE_CARDIO =  "CREATE TABLE " + TABLE_ZIELE_CARDIO + "(" +
            COLUMN_ID           + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_EXTRA        + " TEXT );";

    private static final String CREATE_TABLE_ZIELE_TRAINING =  "CREATE TABLE " + TABLE_ZIELE_TRAINING + "(" +
            COLUMN_ID           + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_EXTRA        + " TEXT, "      +
            COLUMN_MUSKEL       + " TEXT, "      +
            COLUMN_WIEDERHOLUNGEN + " INTEGER )";

    private static final String CREATE_TABLE_ZIELE = "CREATE TABLE " + TABLE_ZIELE + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "FOREIGN KEY(" + COLUMN_K_ID + ") REFERENCES " + TABLE_ZIELE_KOERPER      + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
            "FOREIGN KEY(" + COLUMN_C_ID + ") REFERENCES " + TABLE_ZIELE_CARDIO       + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
            "FOREIGN KEY(" + COLUMN_T_ID + ") REFERENCES " + TABLE_ZIELE_TRAINING     + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
            COLUMN_NAME         + " TEXT, "      +
            COLUMN_ERSTELLDATUM + " LONG, "      +
            COLUMN_DEADLINE     + " LONG, "      +
            COLUMN_DONE         + " INTEGER, "   +
            COLUMN_VALUE        + " FLOAT, "     +
            COLUMN_FORTSCHRITT  + " FLOAT "      +
            ");";

@Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_ZIELE_KOERPER);
        db.execSQL(CREATE_TABLE_ZIELE_CARDIO);
        db.execSQL(CREATE_TABLE_ZIELE_TRAINING);
        db.execSQL(CREATE_TABLE_ZIELE);
    }

日志:

外键定义(代码 1)中的未知列“kid”:,编译时:CREATE TABLE ziele(id INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(kid) REFERENCES koerperziele(id) ON DELETE CASCADE, FOREIGN KEY (cid) REFERENCES heartziele(id) ON DELETE CASCADE, FOREIGN KEY(t_id) REFERENCES trainingsziele(id) ON DELETE CASCADE, name TEXT, erstelldatum LONG, 最后期限 LONG, done INTEGER, value FLOAT, fortschritt FLOAT);

激活外键:

 @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.execSQL("PRAGMA foreign_keys=ON");
    }

编辑:仍然无法正常工作

private static final String CREATE_TABLE_ZIELE = "CREATE TABLE " + TABLE_ZIELE + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME         + " TEXT, "      +
            COLUMN_ERSTELLDATUM + " LONG, "      +
            COLUMN_DEADLINE     + " LONG, "      +
            COLUMN_DONE         + " INTEGER, "   +
            COLUMN_VALUE        + " FLOAT, "     +
            COLUMN_FORTSCHRITT  + " FLOAT, "     +
            "FOREIGN KEY(" + COLUMN_K_ID + " INTEGER) REFERENCES " + TABLE_ZIELE_KOERPER      + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
            "FOREIGN KEY(" + COLUMN_C_ID + " INTEGER) REFERENCES " + TABLE_ZIELE_CARDIO       + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
            "FOREIGN KEY(" + COLUMN_T_ID + " INTEGER) REFERENCES " + TABLE_ZIELE_TRAINING     + "(" + COLUMN_ID + ")  ON DELETE CASCADE  " + ");";

【问题讨论】:

    标签: android sqlite exception key


    【解决方案1】:

    你的CREATE TABLETABLE_ZIELE有两种问题:

    1. 您需要实际指定用作外键的列,例如cid INTEGER

    2. FOREIGN KEYs 等约束位于列规范部分之后。将它们移到最后。

    【讨论】:

    • 第一个是错误的,因为它是一个外键。第二个没有帮助
    • 两者都需要。表约束不声明列,并且不能在列规范之间混合表约束。
    • 是的,您仍然缺少该表中外键的三列规范。
    • 好的,我发现了我的错误。我真的很愚蠢。你完全正确。我很抱歉!
    【解决方案2】:

    您必须将FOREIGN KEY 实现为表或列约束。在您选择的第一种情况下,您需要引用您之前定义的列。

    documentation 中,您可以找到一些正确操作的示例。

    在您的情况下,您需要改用列约束,看起来您打算这样做。

    你可以像这样替换行

    "FOREIGN KEY(" + COLUMN_K_ID + ") REFERENCES " + TABLE_ZIELE_KOERPER + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
    

    COLUMN_K_ID + " REFERENCES " + TABLE_ZIELE_KOERPER + "(" + COLUMN_ID + ")  ON DELETE CASCADE, " +
    

    【讨论】:

    • 我不明白。我为什么要删除那个 FOREIGN KEY(...)?
    • 因为这是您定义引用外部表的列的方式。 FOREIGN KEY 仅用于表约束
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2011-07-14
    • 2012-12-25
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多