2024-08-17|閱讀時間 ‧ 約 32 分鐘

SQL語法修改資料庫 - ALTER TABLE(變更資料表)

    • 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 不支援的指令和功能:

    1. 完整的 ALTER TABLE 支援
      • 只能支援 RENAME TABLE、ADD COLUMN、RENAME COLUMN 和 DROP COLUMN。
      • 不支援 ALTER COLUMN、ADD CONSTRAINT 等其他變更操作。
    2. 修改欄位的資料類型或名稱
      • 無法直接修改欄位的資料類型或名稱。需要通過創建新表、複製數據、刪除舊表並重命名新表來實現。
    3. 刪除欄位
      • 無法直接刪除欄位。需要通過創建新表、複製數據、刪除舊表並重命名新表來實現。
    4. 指定欄位為 PRIMARY KEY 或 UNIQUE
      • 無法在新增欄位時指定該欄位為 PRIMARY KEY 或 UNIQUE。
    5. 完整的觸發器支援
      • 支援 FOR EACH ROW 觸發器,但不支援 FOR EACH STATEMENT 觸發器。
    6. 對 VIEW 的寫操作
      • VIEW 在 SQLite 中是唯讀的,無法執行 DELETE、INSERT 或 UPDATE 操作
    7. GRANT 和 REVOKE
      • 由於 SQLite 是嵌入式資料庫引擎,無法實現 GRANT 和 REVOKE 指令


    ※ 解決⽅案

    創建新 Table :將 Schema 的規格重新定義,再重新創建一個表格。

    • 從舊 Table 複製資料 使用 INSERT INTO new_table SELECT … FROM old_table 將資料從舊表複製到新表。

    • 刪掉舊 Table

    • 把新 Table 改名成原本 Table 的名字

    • 萬⼀途中有些指令失敗? 利用Transaction將舊資料救回來!

    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.