我试图复制我的表格(它没有任何约束,只有INT
带有自动增量的主键)。我写了一个如下方法:
public void copyTable(String srcTableName, String dstTableName,
String[] srcColumns, String[] dstColumns) {
String srcColumnsStr = TextUtils.join(", ", srcColumns);
String dstColumnsStr = TextUtils.join(", ", dstColumns);
String sql = String.format("INSERT INTO %s (%s) SELECT %s FROM %s",
dstTableName, dstColumnsStr, srcColumnsStr, srcTableName);
db.execSQL(sql);
}
在调试器中,我要下一个sql-request:
INSERT INTO timetables (auto_complete, break_duration, color, first_lesson_time, first_week_date, id, lesson_duration, symbol, title, weeks) SELECT _auto_complete, _break_duration, _color, _first_lesson_time, _first_week_date, _id, _lesson_duration, _symbol, _title, _weeks FROM tmptimetables
在这张表中,我有一行,但在此请求之后,该行未被复制到新表中。什么错了?
TABLES
CREATE TABLE tmptimetables (_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,_title NVARCHAR(256) NOT NULL,_weeks INTEGER NOT NULL,_first_week_date INTEGER NOT NULL,_auto_complete INTEGER NOT NULL,_first_lesson_time INTEGER NOT NULL,_lesson_duration INTEGER NOT NULL,_break_duration INTEGER NOT NULL,_color INTEGER NOT NULL,_symbol NCHAR(1) NOT NULL);
CREATE TABLE timetables (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,title NVARCHAR(256) NOT NULL,weeks INTEGER NOT NULL,first_week_date INTEGER NOT NULL,auto_complete INTEGER NOT NULL,first_lesson_time INTEGER NOT NULL,lesson_duration INTEGER NOT NULL,break_duration INTEGER NOT NULL,color INTEGER NOT NULL,symbol NCHAR(1) NOT NULL);
答案 0 :(得分:1)
你的表确实有约束。 NOT NULL
是一种约束。它等于如果此列为NULL,则不插入此表。但是,我不相信这是问题所在。
NOT NULL约束 (突出显示已添加)只能附加到列定义,而不是 指定为表约束。毫不奇怪,一个NOT NULL 约束规定关联列可能不包含NULL 值。插入新项时尝试将列值设置为NULL 行或更新现有的行会导致约束违规。 CREATE TABLE - SQL Data Constraints
相反,问题可能是;按照: -
在这张表中,我有一行,但在此请求之后,行没有 复制到新表中。什么错了?
您正尝试将 tmptimetables 表格中的(插入)复制到时间表表格中。 tmptimetables 虽然你可能真的想要从时间表表复制到tmptimetables(如果不是,那么可能性就是时间表表已经有一行你想要插入的id。)
如果是,那么而不是: -
String sql = String.format("INSERT INTO %s (%s) SELECT %s FROM %s",
dstTableName, dstColumnsStr, srcColumnsStr, srcTableName);
使用
String sql = String.format("INSERT INTO %s (%s) SELECT %s FROM %s",
srcTableName, srcColumnsStr, dstColumnsStr, dstTableName);
或者在调用copyTable
方法时可能更正确地更改参数,以便: -
第四个参数是 tmptimetables 列的字符串数组。
简而言之,插入成为: -
INSERT INTO tmptimetables (
_auto_complete,
_break_duration,
_color,
_first_lesson_time,
_first_week_date,
_id,
_lesson_duration,
_symbol,
_title,
_weeks
)
SELECT
auto_complete,
break_duration,
color,
first_lesson_time,
first_week_date,
id,
lesson_duration,
symbol,
title,
weeks
FROM timetables
注意如果以上不是问题,我建议您编辑问题并包含两个表中的实际数据。猜测你试图使用特定的id插入并且该id已经存在,这将违反INTEGER PRIMARY KEY
约束
NOT NULL
是隐含的,因此无需编码NOT NULL
,