首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite DROP TABLE语句问题

SQLite DROP TABLE语句问题
EN

Stack Overflow用户
提问于 2012-08-24 04:52:00
回答 2查看 1K关注 0票数 4

编辑:在这一点上,我找到了错误的拼写错误,我的问题变成了“我所犯的拼写错误是如何导致我收到的错误的”和“我将来如何才能更好地调试这个错误?”

我已经为SQLite设置了一个数据库脚本(通过pysqlite),如下所示:

代码语言:javascript
复制
DROP TABLE IF EXISTS LandTerritory;
CREATE TABLE LandTerritory (
  name   varchar(50) PRIMARY KEY NOT NULL UNIQUE, 
  hasSC  boolean NOT NULL DEFAULT 0
);

我期望它总是运行时没有错误。但是,如果我运行这个脚本两次(使用sqlite.Connection.executescript方法),我会得到这个错误:

OperationalError:table LandTerritory already exists

我自己试着调试,我自己运行DROP TABLE LandTerritory并得到:sqlite3.OperationalError: no such table: main.LandTerrito

我猜这跟“main”有关一部分,但我不确定是什么。

编辑:好的,PRAGMA foreign_keys=ON肯定也参与其中了。当我创建连接时,我打开了foreign_keys。如果我不打开它,我似乎不会得到这个错误。

我应该提到脚本中还有更多内容,但我假设错误发生在前两个语句中。脚本的其余部分只是执行相同的操作,drop table,define表。其中一些表具有对LandTerritory的外键引用。

有没有办法获得有关sqlite错误的行号信息?这将是非常有帮助的。

编辑2:好的,脚本中的另一个表引用了第一个表。

代码语言:javascript
复制
DROP TABLE IF EXISTS LandAdjacent;
CREATE TABLE LandAdjacent (
  tname1 varchar(50) NOT NULL,
  tname2 varchar(50) NOT NULL,
  PRIMARY KEY (tname1, tname2),
  /* Foreign keys */
  FOREIGN KEY (tname1)
    REFERENCES LandTerrito
    ON DELETE CASCADE
    ON UPDATE CASCADE, 
  FOREIGN KEY (tname2)
    REFERENCES LandTerritory(name)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

看着这个,我发现"LandTerrito“是从哪里来的,不知何故,有几个字符被剪掉了。我猜解决这个问题也许能解决我的问题。

但我真的很困惑这个表中的一条折线是如何导致脚本第一次正确运行的,然后在我第二次运行它时又给了我一个与另一个表相关的错误,以及外键是如何在其中发挥作用的。

我想,从上面重申一下,有没有更好的方法来调试这类东西?

EN

回答 2

Stack Overflow用户

发布于 2015-07-21 20:55:17

错误的来源是您的打字错误

代码语言:javascript
复制
REFERENCES LandTerrito

在你的脚本的第8行。这会导致CREATE TABLE LandAdjacent语句中的表LandTerrito“缺失”。

如果你运行你的两个CREATE TABLE语句,Sqlite不会抱怨。但是,如果您使用PRAGMA foreign_keys=ON;并尝试在表LandAdjacent上运行INSERTDELETE语句,则会得到错误no such table: main.LandTerrito

但是,由于外键约束,LandTerritory上的DROP TABLE将导致表LandAdjacent上的DELETE,这将触发错误。

以下操作可避免出现错误

  1. 在删除表格(已测试)或
  2. 之前设置PRAGMA foreign_keys=ON;先添加虚拟表格LandTerrito (已测试)或
  3. 删除LandAdjacent,然后<代码>D22(已测试)或<代码>H223
  4. 不要使用ON DELETE CASCADE (未测试)
  5. ,当然还要更正原始的拼写错误。
票数 1
EN

Stack Overflow用户

发布于 2012-08-24 07:00:59

在drop table语句和create语句之间放置一个"GO“(或SQLlite中使用的任何等效语句)来终止批处理

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12099802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档