2009年3月9日 星期一

SQLite3 SQL語法 - CREATE TABLE

statement:

每個欄定義是欄名稱後面接著該欄的資料類型,再接著一個或多個選擇性的欄條件約束。欄的資料類型會限制該欄中可儲存的資料內容。如果試圖在欄中儲存不同資料類型的值,執行階段會儘可能將值轉換為適當類型,或引發錯誤。

column-constraint:

NOT NULL 欄條件約束表示該欄不能包含 NULL 值。

UNIQUE 條件約束會導致對指定的一或多個欄建立索引。這個索引必須包含唯一的索引鍵,也就是針對指定的一或多個欄,任兩列均不得包含重製值或值組合。CREATE TABLE 陳述式可以有多個 UNIQUE 條件約束,包括在欄定義中為多個欄指定一個 UNIQUE 條件約束,和 (或) 多個資料表層級的 UNIQUE 條件約束。

CHECK 條件約束會定義一個要評估的運算式,而且該運算式必須為 True,才會插入或更新列的資料。CHECK 運算式必須解析成 Boolean 值。

欄定義中的 COLLATE 子句會指定比較欄的文字項目時所使用的文字定序函數。預設狀況下會使用 BINARY 定序函數。

DEFAULT 條件約束會指定執行 INSERT 時所用的預設值。這個值可為 NULL、字串常數或數字。預設值也可以是 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP 這幾個不區分大小寫的特殊關鍵字中的一個。如果值是 NULL、字串常數或數字,每當 INSERT 陳述式未針對該欄指定值時,這個值就會逐字插入欄中。如果值是 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP,則會將目前的 UTC 日期和/或時間插入欄中。CURRENT_TIME 的格式是 HH:MM:SS。CURRENT_DATE 的格式是 YYYY-MM-DD。CURRENT_TIMESTAMP 的格式是 YYYY-MM-DD HH:MM:SS。

指定 PRIMARY KEY 通常只會在對應的欄上建立 UNIQUE 索引。但如果在具有 INTEGER 資料類型的單一欄上指定 PRIMARY KEY 條件約束,就會使用該欄做為資料表的實際主要索引鍵。這表示該欄只能存放唯一的整數值。如果資料表沒有 INTEGER PRIMARY KEY 欄,則插入列時會自動產生整數索引鍵。只要使用 ROWID、OID 或 _ROWID_ 幾個特殊名稱中的其中一個,便可以隨時存取列的主要索引鍵。不論是明確宣告的 INTEGER PRIMARY KEY 或內部產生的值,都可以使用這些名稱。INTEGER PRIMARY KEY 欄也可以包含關鍵字 AUTOINCREMENT。使用 AUTOINCREMENT 關鍵字時,資料庫在執行 INSERT 陳述式時,會自動在 INTEGER PRIMARY KEY 欄中產生並插入循序遞增的整數索引鍵。

CREATE TABLE 陳述式中只能有一個 PRIMARY KEY 條件約束。它可以是一個欄定義的一部分,也可以一個單一資料表層級 PRIMARY KEY 條件約束。主要索引鍵欄是隱含的 NOT NULL。

接在許多條件約束後面的選擇性 conflict-clause 可以為該條件約束指定另一個預設的條件約束衝突解決演算法。預設值為 ABORT。同一個資料表中的不同條件約束可以使用不同的預設衝突解決演算法。如果 INSERT 或 UPDATE 陳述式指定不同的衝突解決演算法,就會使用該演算法取代 CREATE TABLE 陳述式中指定的演算法。

foreign-key-clause:

額外的條件約束 (如 FOREIGN KEY 條件約束) 不會造成錯誤,但執行階段會予以忽略。

如果 CREATE 和 TABLE 之間出現 TEMP 或 TEMPORARY 關鍵字,則所建立的資料表只會顯示在同一個資料庫連線 (SQLConnection 實體) 中。關閉資料庫連線時,就會自動刪除該資料表。在暫存資料表上建立的任何索引也都是暫時性的。暫存資料表和索引儲存在與主要資料庫檔案不同的另一個檔案中。

如果指定選擇性的 database-name 前置詞,就會在具名資料庫 (以指定的資料庫名稱呼叫 attach() 方法而連接到 SQLConnection 實體的資料庫) 中建立該資料表。除非 database-name 前置詞是 temp,否則,同時指定 database-name 前置詞和 TEMP 關鍵字是錯誤的。如果未指定資料庫名稱,而且沒有 TEMP 關鍵字,則會在主要資料庫 (使用 open() 或 openAsync() 方法連接到 SQLConnection 實體的資料庫) 中建立該資料表。

欄數或資料表的條件約束數目可隨意自訂且沒有限制,另外,列中的資料數量也可隨意自訂且沒有限制。

CREATE TABLE AS 形式會以查詢結果集的形式定義資料表。資料表欄的名稱是結果中欄的名稱。

如果使用選擇性的 IF NOT EXISTS 子句,而且已經有同名的其它資料表,則資料庫會忽略 CREATE TABLE 命令。

使用 DROP TABLE 陳述式可以移除資料表,而使用 ALTER TABLE 陳述式則可以變更限制。

* 所有圖片轉載自:http://www.sqlite.org/

沒有留言:

張貼留言