3

我创建了一个最初没有使用的列,但现在我们正在设置和获取值

我发现列名不正确,我想更改列名但想保留设备中现有数据库的数据

是否有任何查询来检查和重命名sqlite 列这样的东西

Alter Table MyTable RENAME COLUMN IF EXISTS MyColumn TO MyColumn1;

现有数据库在用户端被用户抛出印度请帮助我

笔记:

1.我不想抛出异常

2.也不想重新创建表

我知道两种方式都可以完成任务,但这不是最佳做法

而不是重新创造,我会以糟糕的名字生活

我认为可能有解决方案,因为我们可以像这样检查表格希望我们可以检查列

SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;

或者

SELECT name FROM sqlite_master WHERE type='table' AND name = 'MyTable';
4

2 回答 2

8

据我所知,没有办法按照你的要求去做。但是你可以使用

SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'

检查列是否存在。但是,因为一旦我不知道重新创建表格的问题是什么,您只需重命名该列。娱乐并不意味着数据丢失。

该程序将遵循以下原则:

  1. BEGIN TRANSACTION;
  2. ALTER TABLE table RENAME TO tmp_table;
  3. CREATE TABLE table (columnNames);
  4. INSERT INTO table(columnNames) SELECT columnNamesWrong FROM tmp_table;
  5. DROP TABLE tmp_table_name;
  6. COMMIT;

如果这太麻烦了,请使用工具来完成。

关于最佳实践部分,最佳实践是正确命名您的表。由于您通常围绕字段名称构建所有查询,因此重命名列意味着破坏这些查询。我不知道您在寻找什么,但sqlite 手册指出:

SQLite 支持有限的 ALTER TABLE 子集。SQLite 中的 ALTER TABLE 命令允许用户重命名表或向现有表添加新列。无法重命名列、删除列或在表中添加或删除约束。

注意什么是不可能的。

于 2013-08-08T08:31:17.200 回答
1

实际上可以重命名 SQLite 中的列:

  1. 通过执行以下查询来读取表定义:

    SELECT sql FROM sqlite_master WHERE type='table' AND name='MyTable'
    

    这将为您提供整个CREATE TABLE声明。

    然后,您必须在代码中检查此表定义是否包含旧列名或新列名。如果它已经有了新名称,请停止。如果不是,请将旧名称替换为新名称。

  2. 执行以下魔术命令以允许更改表定义:

    PRAGMA writable_schema = on
    
  3. sqlite_master使用新表定义更新表中的该记录:

    UPDATE sqlite_master SET sql = ? WHERE type='table' AND name='MyTable'
    
  4. 切换危险设置:

    PRAGMA writable_schema = off
    

请注意,这是一种非常危险的机制;SQLite 使用sql列中的文本来确定数据在数据库文件中的存储方式,因此更改除了列名之外的几乎任何内容都会导致数据库损坏。

于 2013-08-08T09:43:25.813 回答