修改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字段(欄位)類型”
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);
}
}
}