修改SQL/SQLite字段(欄位)類型

修改SQL/SQLite字段(欄位)類型

修改SQL/SQLite字段(欄位)類型


資料來源: https://blog.csdn.net/guofuyou/article/details/16918517


 查詢特定資料表的SQL語法

SELECT sql FROM sqlite_master WHERE name='condiment_data' AND type='table';

CREATE TABLE "condiment_data" (
  "SID" int NOT NULL,
  "company_sid" int NOT NULL,
  "condiment_code" varchar(10),
  "condiment_name" varchar(30) NOT NULL,
  "condiment_price" decimal(10,2) NOT NULL,
  "unit_sid" int,
  "group_sid" int NOT NULL,
  "sort" int NOT NULL DEFAULT 0,
  "stop_flag" char(1) NOT NULL DEFAULT 'N',
  "stop_time" timestamp NOT NULL DEFAULT '0000-00-00',
  "del_flag" char(1) NOT NULL DEFAULT 'N',
  "del_time" timestamp NOT NULL DEFAULT '0000-00-00',
  "created_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updated_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY ("SID", "company_sid")
)


— 查詢特定資料表所有欄位名稱與欄位型態

PRAGMA table_info(table_name)


— 增加字段(欄位)

ALTER TABLE Cftea_table Add column_name new_data_type


— 刪除字段(欄位)

ALTER TABLE Cftea_table DROP COLUMN column_name


— 修改字段類型(欄位)

ALTER TABLE Cftea_table ALTER COLUMN column_name new_data_type


但是在SQLite 中卻不能這麼做,因為SQLite 目前還不支持直接修改字段。

SQLite只有變通處理如下:

-- 把原表改成另外一個名字作為暫存表
ALTER TABLE old_table_name RENAME TO temp_table_name;

-- 如果需要,可以刪除原表的索引
DROP INDEX ix_name;

-- 用原表的名字創建新表
CREATE TABLE old_table_name(field_name INTEGER PRIMARY KEY AUTOINCREMENT, other_field_name text not null );

-- 如果需要,可以創建新表的索引
CREATE INDEX ix_name ON old_table_name(field_name);

-- 將暫存表數據寫入到新表,很方便的是不需要去理會自動增長的ID
INSERT INTO old_table_name SELECT * FROM temp_table_name

-- 刪除暫存表
DROP TABLE temp_table_name;

One thought on “修改SQL/SQLite字段(欄位)類型

  1. C# 實作測試OK

    public static void DBColumnsModifying(String StrTable, String StrColumn, String StrType)//修改欄位
    {
    String SQL = "";
    bool blnCheck = false;
    SQL = String.Format("PRAGMA table_info({0})", StrTable, StrColumn, StrType);
    DataTable chaekDataTable = GetDataTable(SQL);
    if (chaekDataTable != null)
    {
    bool blnDifference = false;
    //判斷欄位是否已是正確型態
    for (int i=0;i< chaekDataTable.Rows.Count;i++)
    {
    if (chaekDataTable.Rows[i]["name"].ToString() == StrColumn)
    {
    if(chaekDataTable.Rows[i]["type"].ToString() != StrType)
    {
    blnDifference = true;
    }
    else
    {
    blnDifference = false;
    }
    break;
    }
    }
    if(blnDifference)
    {
    //舊表更名
    SQL = String.Format("ALTER TABLE {0} RENAME TO temp_{0}",StrTable, StrColumn, StrType);
    SQLiteInsertUpdateDelete(SQL);
    //建立新表
    SQL = VPOSInitialTableSyntax(StrTable);//取出 存在程式碼最新的SQLit最新最正確的建表SQL
    SQLiteInsertUpdateDelete(SQL);
    //複製資料
    SQL = String.Format("INSERT INTO {0} SELECT * FROM temp_{0}",StrTable, StrColumn, StrType);
    SQLiteInsertUpdateDelete(SQL);
    //刪除舊表
    SQL = String.Format("DROP TABLE temp_{0}", StrTable, StrColumn, StrType);
    SQLiteInsertUpdateDelete(SQL);
    }
    }
    }

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *