如果存在sqlite,重命名列?

时间:2013-08-08 06:14:01

标签: sqlite

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

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

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

Alter Table MyTable RENAME COLUMN IF EXISTS MyColumn TO MyColumn1;

现有数据库在用户端被用户抛出INDIA使用 请帮帮我

注意:

1。我不想抛出异常

2。也不想重新创建表格

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

而不是重新创造我会生活在一个糟糕的名字

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

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

OR

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

2 个答案:

答案 0 :(得分:7)

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

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

检查列是否存在。但是,由于您只需要重命名该列,因此我不知道重新创建表的问题。娱乐 NOT 意味着数据丢失。

程序将遵循:

  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;
  7. 如果这很麻烦,请使用tool来执行此操作。

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

      

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

    请注意 NOT 可能是什么。

答案 1 :(得分:1)

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

  1. 执行此查询读取表定义:

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

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

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

  2. 执行以下magic command以允许更改表定义:

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

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

    PRAGMA writable_schema = off
    
  5. 请注意,这是一个非常危险的机制; SQLite使用sql列中的文本来确定数据如何存储在数据库文件中,因此更改除列名以外的任何内容肯定会导致数据库损坏。

相关问题