如果存在sqlite,重命名列?

问题描述 投票:0回答:2

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

我发现列名不正确,我想更改它。

是否有任何查询来检查和重命名 SQLite 列,也许是这样的:

ALTER TABLE MyTable RENAME COLUMN IF EXISTS MyColumn TO MyColumn1;

注:

  1. 我不想抛出异常
  2. 我不想重新创建表格

(我知道两种方法都能完成任务,但我宁愿背负着不好的名字。)

sqlite
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 中的命令允许用户重命名表或添加新表 列到现有表。无法重命名列, 删除列,或者添加或删除表中的约束。

注意什么是不可能可能的。


2
投票

实际上可以在 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
列中的文本来确定数据如何存储在数据库文件中,因此更改除列名之外的几乎所有内容肯定会导致数据库损坏。

© www.soinside.com 2019 - 2024. All rights reserved.