【问题标题】:"delete from table" doesn't delete table?“从表中删除”不删除表?
【发布时间】:2010-12-31 12:40:49
【问题描述】:

我创建了“database.db”,一切正常,但为什么最后不删除表?每次我运行它时,我都会在创建表时收到“表已存在”错误消息。

int main()
{
 sqlite3 *db; //Database Handle
 char *zErr;
 int rc;
 char *sql;

 rc = sqlite3_open("database.db", &db);

 if(rc)
 {
  cout << "Can't open database: " << sqlite3_errmsg(db) << endl;;
  sqlite3_close(db);
  exit(1);
 }

 sql = "create table test(PID int primary key, Name text)"; //sql query

 rc = sqlite3_exec(db, sql, NULL, NULL, &zErr); //execute sql statement

 if(rc != SQLITE_OK)
 {
  if (zErr != NULL)
  {
   cout << "SQL error: " << zErr << endl;
   sqlite3_free(zErr);
  }
 }
 else
 {
  sql = "insert into test values (1,'John')";
  rc = sqlite3_exec(db, sql, NULL, NULL, &zErr);

  sql = "insert into test values (2,'Smith')";
  rc = sqlite3_exec(db, sql, NULL, NULL, &zErr);
 }



    //delete the table on exit.

 rc = sqlite3_exec(db, "delete from test", NULL, NULL, &zErr);

 sqlite3_close(db);
 return 0;
}

另外,主键可以在数据库中存在的最后一个更大的键之后自动生成吗?

【问题讨论】:

标签: c++ sql sqlite


【解决方案1】:

您需要使用drop tabledelete 删除表中的行。

rc = sqlite3_exec(db, "drop table test", NULL, NULL, &zErr);

SQLite 将自动递增声明为主键的整数字段。见here

【讨论】:

    【解决方案2】:

    您使用DELETE 命令删除表中的行。

    您使用DROP 命令删除整个表或其他数据库项。

    如果您不确定它是否存在,也可以使用CREATE TABLE IF NOT EXISTS 创建表。

    要获取自动生成的行 ID,请在 CREATE TABLE 命令中使用:id INTEGER PRIMARY KEY

    【讨论】:

      【解决方案3】:
      1. 使用DROP TABLE
      2. 来自 SQLite 文档:

      通常的算法是给新创建的行一个比插入前表中最大的ROWID大一的ROWID。

      【讨论】:

        【解决方案4】:

        DML "delete from test" 确实从表 test 中删除了所有行。如果您想删除表格,请尝试“delete table test”或“drop table”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-29
          • 2013-01-17
          • 1970-01-01
          • 2011-07-26
          • 1970-01-01
          • 2011-04-11
          • 2021-12-26
          • 2019-02-18
          相关资源
          最近更新 更多