ALTER TABLE
: 這個命令是用來修改資料表的結構,例如新增、修改或刪除欄位。它針對的是資料表(table)本身的結構,而不是具體的記錄(record)。INSERT
和UPDATE
: 這兩個命令是用來操作具體的記錄(record)。INSERT
用於新增記錄,而UPDATE
用於修改現有的記錄。ALTER TABLE
常見的使用情境:
新增欄位:
當需要在現有的資料表中新增一個欄位來儲存新的資訊時,例如新增 city
欄位來記錄使用者的居住地。
修改欄位名稱或型別:
當需要修改欄位的名稱或資料型別時,例如將 last_login
欄位的型別從 DATE
改為 TIMESTAMP
以提高精確度。
刪除欄位:
當某個欄位不再需要時,可以刪除該欄位以節省空間。修改資料表名稱:
當需要修改資料表的名稱時,可以使用 ALTER TABLE
語法。
※ 新增 Column
語法

ALTER TABLE table
:宣告ALTER TABLE
語法後,接指定要修改的資料表。ADD [COLUMN] column_name column_definition
:新增一個名為column_name
的欄位,並定義其資料類型(型別)和屬性(例如VARCHAR(255)
或INT
)。[FIRST|AFTER existing_column]
:選擇性參數,決定新欄位的位置。FIRST
表示將新欄位放在第一個位置,AFTER existing_column
表示將新欄位放在指定欄位之後。若不指定,預設會新增在最後面。
實例


※ 修改 Column DEFINITION(屬性和資料型別)
語法

ALTER TABLE table_name
:要修改名為table_name
的資料表。MODIFY column_name column_definition [FIRST | AFTER column_name]
:要修改名為column_name
的欄位,並重新定義其資料類型和屬性(例如VARCHAR(255)
或INT
)。[FIRST | AFTER column_name]
這是選擇性參數,表示要將修改後的欄位放在資料表中的特定位置。FIRST
表示將欄位放在資料表的第一個位置,而AFTER column_name
表示將欄位放在指定欄位之後。- 這段語法可以包含多個
MODIFY
語句,每個語句用逗號分隔。
實例


※ 修改 COLUMN 名字
語法

ALTER TABLE table_name
:要修改名為table_name
的資料表。CHANGE COLUMN original_name new_name column_definition
:要將名為original_name
的欄位改名為new_name
,並重新定義其資料類型和屬性(例如VARCHAR(255)
或INT
)。[FIRST | AFTER column_name]
:這是選擇性參數,表示要將修改後的欄位放在資料表中的特定位置。FIRST
表示將欄位放在資料表的第一個位置,而AFTER column_name
表示將欄位放在指定欄位之後。
實例

※ 刪除 COLUMN
語法

ALTER TABLE table_name
:要修改名為table_name
的資料表。DROP COLUMN column_name
:要刪除名為column_name
的欄位。
實例

※ 改 Table 名字
語法

ALTER TABLE table_name
RENAME TO new_table_name
ALTER TABLE table_name
:要修改名為table_name
的資料表。RENAME TO new_table_name
:要將資料表重新命名為new_table_name
。
實例

※ MYSQL 和 SQLite 在 ALTER TABLE 的差異

SQLite 不支援的指令和功能:
- 完整的 ALTER TABLE 支援:
- 只能支援 RENAME TABLE、ADD COLUMN、RENAME COLUMN 和 DROP COLUMN。
- 不支援 ALTER COLUMN、ADD CONSTRAINT 等其他變更操作。
- 修改欄位的資料類型或名稱:
- 無法直接修改欄位的資料類型或名稱。需要通過創建新表、複製數據、刪除舊表並重命名新表來實現。
- 刪除欄位:
- 無法直接刪除欄位。需要通過創建新表、複製數據、刪除舊表並重命名新表來實現。
- 指定欄位為 PRIMARY KEY 或 UNIQUE:
- 無法在新增欄位時指定該欄位為 PRIMARY KEY 或 UNIQUE。
- 完整的觸發器支援:
- 支援 FOR EACH ROW 觸發器,但不支援 FOR EACH STATEMENT 觸發器。
- 對 VIEW 的寫操作:
- VIEW 在 SQLite 中是唯讀的,無法執行 DELETE、INSERT 或 UPDATE 操作。
- GRANT 和 REVOKE:
- 由於 SQLite 是嵌入式資料庫引擎,無法實現 GRANT 和 REVOKE 指令。
※ 解決⽅案
• 創建新 Table :將 Schema 的規格重新定義,再重新創建一個表格。
• 從舊 Table 複製資料 :使用 INSERT INTO new_table SELECT … FROM old_table
將資料從舊表複製到新表。
• 刪掉舊 Table
• 把新 Table 改名成原本 Table 的名字
• 萬⼀途中有些指令失敗? 利用Transaction將舊資料救回來!