gpt4 book ai didi

android - 将数据复制到新表时,NOT NULL约束失败

转载 作者:行者123 更新时间:2023-12-03 17:51:50 26 4
gpt4 key购买 nike

我将数据库从SQLiteOpenHelper迁移到Room。

我有一个要更改的表,我们称它为"my_table"
其简化的create语句:

CREATE TABLE `my_table`
(`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`title` TEXT
)


在进行其他更改的升级期间,我添加了新列 type INTEGER NOT NULL(我还将添加外键并进行其他重要更改,这就是创建新表而不是更改现有表的原因):

CREATE TABLE "new_table" 
(`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`title` TEXT,
`type` INTEGER NOT NULL
)


然后,我想将数据从 my_table复制到 new_table并设置 type列的值。

SQL语句:

INSERT INTO new_table (title) 
SELECT title FROM my_table;
UPDATE new_table SET type = 1;
DROP TABLE my_table;
ALTER TABLE new_table RENAME TO my_table;


Android迁移:

public static final Migration MIGRATION_TEST = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
// Create new table
database.execSQL("CREATE TABLE new_table (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT, `type` INTEGER NOT NULL)");
// Copy some data
database.execSQL("INSERT INTO new_table (title) SELECT title FROM old_table"); // constraint violation
// Insert default value into the measures column
database.execSQL("UPDATE new_table SET type = 1");
// Delete old table
database.execSQL("DROP TABLE old_table");
// Rename new table
database.execSQL("ALTER TABLE new_table RENAME TO my_table");
}
};


显然我得到 NOT NULL constraint failed: new_table.type错误:

android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: new_table.type (code 1299)
Error Code : 1299 (SQLITE_CONSTRAINT_NOTNULL)
Caused By : Abort due to constraint violation.
(NOT NULL constraint failed: new_table.type (code 1299))


我可以通过更改新表的create语句并为 type列设置默认值来避免这种情况。

CREATE TABLE "new_table" 
(`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`title` TEXT,
`type` INTEGER NOT NULL DEFAULT 1
)


但是我不想这样做,因为Room不会开箱即用默认值,并且为了避免将来在向表中插入新值时出现错误。

在将数据插入到新表中时,是否有任何变通办法来避免此错误?

最佳答案

我认为以下可能有效:

database.execSQL("INSERT INTO new_table (title,type) SELECT title, 1 FROM old_table");


也就是说,您现在要按照SELECT语句对INSERT 2列说。 SELECT返回2个值,分别是old_table的标题和文字值1。


也就是说,SELECT实际返回表达式 result-column的结果,该结果不仅限于列。表达式可以是文字值,函数结果,运算结果和其他 expr
按照



SELECT和FROM关键字之间的表达式列表是已知的
作为结果表达式列表。


SQL As Understood By SQLite - SELECT - 3. Generation of the set of result rows.


这样,您就不需要 database.execSQL("UPDATE new_table SET type = 1")

关于android - 将数据复制到新表时,NOT NULL约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com