- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的UWP应用中,我正在sqlite数据库中的“应用开始”上创建表。另外,我编写了各种Alter命令,其中我检查安装的应用程序是否包含Customertbl中的相应列,并将Customertbl表重命名为Customertbl_old并创建新表Customertbl,最后我将Customertbl_old表中的所有行存储到Customertbl表中。然后我删除表Customertbl_old。
现在,到目前为止,一切都可以正常工作,但是,当我尝试在OwnerTbl中删除/插入一行时,它将引发异常,
SQLite错误:没有这样的表main.Customertbl_old存在。
//**Code where a column name is updated by creating new table**
string tableCommand = "PRAGMA table_info(Recordings)";
SqliteCommand createTable = new SqliteCommand(tableCommand, db);
SqliteDataReader query = createTable.ExecuteReader();
tableCommand = "PRAGMA foreign_keys = off; " + "
BEGIN TRANSACTION; " +
" ALTER TABLE Customertbl RENAME TO _Customertbl_old; " +
" CREATE TABLE Customertbl ( " + " ID INTEGER PRIMARY KEY AUTOINCREMENT, " + " CustomerName NVARCHAR(100) NULL, " + " Password NVARCHAR(100) NULL, " + "
pkID INTEGER NULL, " + " ActivityName NVARCHAR(255) NULL);" +
" INSERT INTO Customertbl(Name,Password) " + " SELECT Name,Password " + "
FROM _Customertbl_old ;" + " COMMIT; " + " PRAGMA foreign_keys=on; " + "
DROP TABLE
_Customertbl_old";
// **code where exception occur**
using (SqliteConnection db = new
SqliteConnection("Filename=" + App.dbName))
{
db.Open();
SqliteCommand deleteCommand = new SqliteCommand();
try
{
deleteCommand.Connection = db;
deleteCommand.CommandText = "DELETE FROM Ownertbl where fkId = @id";
deleteCommand.Parameters.AddWithValue("@id", id);
deleteCommand.ExecuteReader()//here the exception occur ;
db.Close();
}
}
最佳答案
发生了什么
由于在版本3.25.0(2018-09-15)和3.26.0(2018-12-01)中对SQLite的ALTER TABLE
命令进行了更改,因此出现了您的问题。有关官方文档,请参见SQLite网站上的ALTER TABLE。
在此版本之前,重命名表(例如,从MY_TABLE
到A_BETTER_NAMED_TABLE
)只能更改表的名称。对该表的任何引用(即在外键(FK)约束或触发器中)均未重命名。如果目标是仅重命名表,则可以合理地将其视为错误,因为没有(简便,正式)的方式来更改这些引用,并且您将获得不一致的数据库。
上面的更改通过将对表名的更改传播到任何此类引用中来“解决”了此问题。因此,您可以重命名由FK约束或触发器引用的表,并保留一个一致的数据库。
何时引起问题
由于ALTER TABLE
命令的能力非常有限(与非Lite数据库引擎相比),OP的问题间接地出现了。在SQLite中,它所能做的就是更改表名,列名或添加新列(到行的“结尾”)。如果您需要对表执行比该表更复杂的操作,则必须进行“创新”(本质上是,创建一个新的替换表并从旧表中填充它)。但是,有两种方法可以做到这一点,其中一种被上述更改“试图变得更有用”而“中断”。
安全的方法
使用所需的所有新属性创建一个新的(例如MY_TABLE_NEW
)。
将现有数据从MY_TABLE
迁移到MY_TABLE_NEW
(适当添加默认值/缺失值)。
删除原始表MY_TABLE
。此时,任何引用MY_TABLE
的FK约束和触发器都将失败,但这无关紧要。
使用ALTER TABLE MY_TABLE_NEW RENAME TO MY_TABLE
将格式正确的新表的名称更改回原始表的名称。现在将再次满足所有FK约束/触发器引用(假定它们不针对已删除的列!)
上面的内容在更改之前和之后都适用。更改之前,无需关注FK约束/触发器;更改后,将不再引用MY_TABLE_NEW
,因此不会传播任何内容。
断路
在更改之前,以下过程将同样有效:
使用ALTER TABLE MY_TABLE RENAME TO MY_TABLE_OLD
。在这一点上,在旧版本中,任何FK内容/触发都将不一致,但这无关紧要。
使用所需的所有新属性创建替换表MY_TABLE
。现在将满足所有引用。
将现有数据从MY_TABLE_OLD
迁移到MY_TABLE
(适当添加默认值/缺失值)。
删除原始(但已重命名)表MY_TABLE_OLD
。
新版本会出现问题,因为它将重命名对原始表(MY_TABLE
)的所有引用,从而使它们现在可以引用即将删除的表(MY_TABLE_OLD
)。其他步骤均不会影响这些引用,因此您将获得一个不一致的数据库(对不存在的MY_TABLE_OLD
的引用)。
修复
可以将表操作步骤的顺序更改为“安全方式”中的顺序,也可以按照ALTER TABLE页上的说明,在PRAGMA legacy_alter_table=ON
命令之前发出命令ALTER TABLE
。这将防止“改进”行为将对MY_TABLE
的引用重命名为MY_TABLE_OLD
。
关于c# - SQLite错误:不存在这样的表main.table_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253045/
我正在开发一个 SQLite 数据库。数据库已经填满了,但我想重构它。这是我需要做的一个示例: 我目前有一张 table : CREATE TABLE Cars (ID INTEGER PRIMARY
我正在使用 Mono、SQLite、Dapper 和 Dapper 扩展。我可以从数据库中读取数据,但插入不起作用。我正在使用 sqlite 的 Mono 驱动程序。 错误并不能提供太多信息,至少对我
我有一个使用 SQLite 的 Windows Phone 8 应用程序。该应用程序具有许多数据库功能,并包含一个 sqlite 数据库文件,在运行该应用程序时,该文件将被复制到本地文件夹并进行访问。
为 sqlite 创建索引时有排序顺序。 https://sqlite.org/lang_createindex.html Each column name or expression can be
顾名思义,我怀疑如果有一些引用被删除的表会发生什么,例如表的某些字段的索引。 SQLite是否会自动处理?在执行drop命令之前,数据库所有者是否应注意任何实例? 最佳答案 我认为不需要家政服务。 S
我想知道是否有可能将从计数中获得的整数转换为REAL 类似于以下内容(尽管这不起作用) SELECT CAST (COUNT (ColumnA) AS Count) AS REAL) FROM Tab
我无法在SQLite数据库上执行一些更新。我正在Windows上使用SQLite 3 Shell。 我正在运行以下命令: update resovled_chrom_counts set genus
我知道SQLite中的触发器顺序是不确定的(您不能确定将首先执行哪个触发器),但是表约束和触发器之间的关系又如何呢? 我的意思是,假设我在一个列中有一个UNIQUE(或CHECK)约束,并且在该表上有
我的 CustomTags 表可能有一系列“临时”记录,其中 Tag_ID 为 0,并且 Tag_Number 将有一些五位数的值。 定期,我想清理我的 Sqlite 表以删除这些临时值。 例如,我可
我有A,B,C和D的记录。 我的SQL1 SELECT * FROM main_table order by main_table.date desc limit 2返回A和B。 我的SQL2 SEL
select round(836.0)返回836.0 我如何删除sqlite查询中的尾随零。 836.00应该是836 836.440应该是836.44 最佳答案 如果需要836.44,则需要十进制返
我正在研究RQDA中的文本,并且正在使用Firefox SQLite Manager访问数据库,以便可以更轻松地搜索文件。我创建并填充了虚拟表: CREATE VIRTUAL TABLE texts
我有这样的数据: table1 id | part | price 1 | ox900 | 100 2 | ox980 | 200 和 table2 id | part | price 1
我正在尝试将一些数据插入现有的SQLite表中。该表和数据库是使用相同的API创建的,但是由于某种原因,插入操作无效,并且从不给我任何错误消息。 我正在BlackBerry 9550模拟器上对此进行测
例如,我在名为SALARY的列中插入一个值。如果插入的值大于1000,我想将字符串HIGH插入到RANK列中,否则将插入LOW中。 我可以使用SQLite做到吗? 最佳答案 在插入之前使用触发器,然后
假设我有一个包含三列A,B,C的表t1,其中(A,B)包含唯一键(具有数十万行)。由于90%的查询将采用SELECT C FROM t1 WHERE A =?和B = ?,我想我要为A,B和C提供覆盖
在一个SQLite3数据库中,我有一个表“ projects”,其id字段由以下方式组成: [user id]_[user's project id] 例如,用户ID = 45,这是一些数据: 45_
我了解PRAGMA foreign_key和ON DELETE RESTRICT/NO ACTION的概念,但是我面临的是另一种情况。 我需要删除一个父行,但保持与之关联的子行。例如: CREATE
我的c#应用程序从Web服务1读取文件列表,并将完整的文件名插入table1,然后从第二个Web服务读取list并将它们插入到table2。 这些表具有相同的结构,如下所示: create table
我在以下情况下尝试将Record1的ID更新为Record2的ID: 两个表中的名称相同,并且 在Record2中权重更大。 记录1 | ID | Weight | Name | |----|----
我是一名优秀的程序员,十分优秀!