如何使用 SQL CREATE TABLE 創建新表

来源:https://www.cnblogs.com/vin-c/archive/2022/05/19/16287317.html
-Advertisement-
Play Games

本文介紹如何使用 SQL CREATE TABLE 創建新表,DROP TABLE 用來完整地刪除一個表,ALTER TABLE 用來更改表列或其他諸如約束或索引等對象。 一、創建表 SQL 不僅用於表數據操縱,而且還用來執行資料庫和表的所有操作,包括表本身的創建和處理。 一般有兩種創建表的方法: ...


目錄

本文介紹如何使用 SQL CREATE TABLE 創建新表,DROP TABLE 用來完整地刪除一個表,ALTER TABLE 用來更改表列或其他諸如約束或索引等對象。

一、創建表

SQL 不僅用於表數據操縱,而且還用來執行資料庫和表的所有操作,包括表本身的創建和處理。

一般有兩種創建表的方法:

  • 多數 DBMS 都具有互動式創建和管理資料庫表的工具;
  • 表也可以直接用 SQL 語句操縱。

用程式創建表,可以使用 SQL 的 CREATE TABLE 語句。

需要註意的是,使用互動式工具時實際上就是使用 SQL 語句。這些語句不是用戶編寫的,界面工具會自動生成並執行相應的 SQL 語句(更改已有的表時也是這樣)。

註意:語法差別

在不同的 SQL 實現中,CREATE TABLE 語句的語法可能有所不同。對於具體的 DBMS 支持何種語法,請參閱相應的文檔。

本文不會介紹創建表時可以使用的所有選項,那超出了本文的範圍,我只給出一些基本選項。詳細的信息說明,請參閱具體的 DBMS 文檔。

說明:各種 DBMS 創建表的具體例子

關於不同 DBMS 的 CREATE TABLE 語句的具體例子,請參閱 學習 SQL 所用到的樣例表腳本 中給出的樣例表創建腳本。

1.1 表創建基礎

利用 CREATE TABLE 創建表,必須給出下列信息:

  • 新表的名字,在關鍵字 CREATE TABLE 之後給出;
  • 表列的名字和定義,用逗號分隔;
  • 有的 DBMS 還要求指定表的位置。

下麵的 SQL 語句創建 Products 表:

CREATE TABLE Products
(
    prod_id       CHAR(10)          NOT NULL,
    vend_id       CHAR(10)          NOT NULL,
    prod_name     CHAR(254)         NOT NULL,
    prod_price    DECIMAL(8,2)      NOT NULL,
    prod_desc     VARCHAR(1000)     NULL
);

從上面的例子可以看到,表名緊跟 CREATE TABLE 關鍵字。

實際的表定義(所有列)括在圓括弧之中,各列之間用逗號分隔。

這個表由 5 列組成。每列的定義以列名(它在表中必須是唯一的)開始,後跟列的數據類型(關於數據類型的解釋,請參閱 學習 SQL 之前需要瞭解的基礎知識。此外,SQL 常用的數據類型 列出了常見的數據類型及相容性)。

整條語句以圓括弧後的分號結束。

前面提到,不同 DBMS 的 CREATE TABLE 的語法有所不同,這個簡單腳本也說明瞭這一點。

這條語句在絕大多數 DBMS 中有效,但對於 DB2,必須從最後一列中去掉 NULL。這就是對於不同的 DBMS,要編寫不同的表創建腳本的原因(參見 學習 SQL 所用到的樣例表腳本)。

提示:語句格式化

回想一下在 SQL 語句中忽略的空格。語句可以在一個長行上輸入,也可以分成許多行,它們沒有差別。

這樣,你就可以用最適合自己的方式安排語句的格式。

前面的 CREATE TABLE 語句就是 SQL 語句格式化的一個好例子,代碼安排在多個行上,列定義進行了恰當的縮進,更易閱讀和編輯。

以何種格式安排 SQL 語句並沒有規定,但我強烈推薦採用某種縮進格式。

提示:替換現有的表

在創建新的表時,指定的表名必須不存在,否則會出錯。

防止意外覆蓋已有的表,SQL 要求首先手工刪除該表(請參閱後面的內容),然後再重建它,而不是簡單地用創建表語句覆蓋它。

1.2 使用 NULL 值

如何使用 SQL WHERE 過濾返回的數據 中提到,NULL 值就是沒有值或缺值。允許 NULL 值的列也允許在插入行時不給出該列的值。不允許 NULL 值的列不接受沒有列值的行,換句話說,在插入或更新行時,該列必須有值。

每個表列要麼是 NULL 列,要麼是 NOT NULL 列,這種狀態在創建時由表的定義規定。請看下麵的例子:

CREATE TABLE Orders
(
    order_num      INTEGER      NOT NULL,
    order_date     DATETIME     NOT NULL,
    cust_id        CHAR(10)     NOT NULL
);

這條語句創建本文中所用的 Orders 表。Orders 包含三列:訂單號、訂單日期和顧客 ID。這三列都需要,因此每一列的定義都含有關鍵字 NOT NULL

這就會阻止插入沒有值的列。如果插入沒有值的列,將返回錯誤,且插入失敗。

下一個例子將創建混合了 NULLNOT NULL 列的表:

CREATE TABLE Vendors
(
    vend_id          CHAR(10)     NOT NULL,
    vend_name        CHAR(50)     NOT NULL,
    vend_address     CHAR(50)     ,
    vend_city        CHAR(50)     ,
    vend_state       CHAR(5)      ,
    vend_zip         CHAR(10)     ,
    vend_country     CHAR(50)
);

這條語句創建 Vendors 表。供應商 ID 和供應商名字列是必需的,因此指定為 NOT NULL

其餘五列全都允許 NULL 值,所以不指定 NOT NULLNULL 為預設設置,如果不指定 NOT NULL,就認為指定的是 NULL

註意:指定 NULL

在不指定 NOT NULL 時,多數 DBMS 認為指定的是 NULL,但不是所有的 DBMS 都這樣。

某些 DBMS 要求指定關鍵字 NULL,如果不指定將出錯。關於完整的語法信息,請參閱具體的 DBMS 文檔。

提示:主鍵和 NULL

學習 SQL 之前需要瞭解的基礎知識 介紹過,主鍵是其值唯一標識表中每一行的列。只有不允許 NULL 值的列可作為主鍵,允許 NULL 值的列不能作為唯一標識。

註意:理解 NULL

不要把 NULL 值與空字元串相混淆。NULL 值是沒有值,不是空字元串。

如果指定 ''(兩個單引號,其間沒有字元),這在 NOT NULL 列中是允許的。

空字元串是一個有效的值,它不是無值。

NULL 值用關鍵字 NULL 而不是空字元串指定。

1.3 指定預設值

SQL 允許指定預設值,在插入行時如果不給出值,DBMS 將自動採用預設值。預設值在 CREATE TABLE 語句的列定義中用關鍵字 DEFAULT 指定。

請看下麵的例子:

CREATE TABLE OrderItems
(
    order_num      INTEGER          NOT NULL,
    order_item     INTEGER          NOT NULL,
    prod_id        CHAR(10)         NOT NULL,
    quantity       INTEGER          NOT NULL      DEFAULT 1,
    item_price     DECIMAL(8,2)     NOT NULL
);

這條語句創建 OrderItems 表,包含構成訂單的各項(訂單本身存儲在 Orders 表中)。quantity 列為訂單中每個物品的數量。

在這個例子中,這一列的描述增加了 DEFAULT 1,指示 DBMS,如果不給出數量則使用數量 1

預設值經常用於日期或時間戳列。

例如,通過指定引用系統日期的函數或變數,將系統日期用作預設日期。

MySQL 用戶指定 DEFAULT CURRENT_DATE(),Oracle 用戶指定 DEFAULT SYSDATE,而 SQL Server 用戶指定 DEFAULT GETDATE()

遺憾的是,這條獲得系統日期的命令在不同的 DBMS 中大多是不同的。

表 1 列出了這條命令在某些 DBMS 中的語法。這裡若未列出某個 DBMS,請參閱相應的文檔。

表 1 獲得系統日期

DBMS 函數/變數
DB2 CURRENT_DATE
MySQL CURRENT_DATE()
Oracle SYSDATE
PostgreSQL CURRENT_DATE
SQL Server GETDATE()
SQLite date('now')

提示:使用 DEFAULT 而不是 NULL

許多資料庫開發人員喜歡使用 DEFAULT 值而不是 NULL 列,對於用於計算或數據分組的列更是如此。

二、更新表

更新表定義,可以使用 ALTER TABLE 語句。雖然所有的 DBMS 都支持 ALTER TABLE,但它們所允許更新的內容差別很大。

以下是使用 ALTER TABLE 時需要考慮的事情。

  • 理想情況下,不要在表中包含數據時對其進行更新。應該在表的設計過程中充分考慮未來可能的需求,避免今後對錶的結構做大改動。
  • 所有的 DBMS 都允許給現有的表增加列,不過對所增加列的數據類型(以及 NULLDEFAULT 的使用)有所限制。
  • 許多 DBMS 不允許刪除或更改表中的列。
  • 多數 DBMS 允許重新命名錶中的列。
  • 許多 DBMS 限制對已經填有數據的列進行更改,對未填有數據的列幾乎沒有限制。

可以看出,對已有表做更改既複雜又不統一。對錶的結構能進行何種更改,請參閱具體的 DBMS 文檔。

使用 ALTER TABLE 更改表結構,必須給出下麵的信息:

  • ALTER TABLE 之後給出要更改的表名(該表必須存在,否則將出錯);
  • 列出要做哪些更改。

因為給已有表增加列可能是所有 DBMS 都支持的唯一操作,所以我們舉個這樣的例子:

ALTER TABLE Vendors
ADD vend_phone CHAR(20);

這條語句給 Vendors 表增加一個名為 vend_phone 的列,其數據類型為 CHAR

更改或刪除列、增加約束或增加鍵,這些操作也使用類似的語法。

註意,下麵的例子並非對所有 DBMS 都有效:

ALTER TABLE Vendors
DROP COLUMN vend_phone;

複雜的表結構更改一般需要手動刪除過程,它涉及以下步驟:

(1) 用新的列佈局創建一個新表;

(2) 使用 INSERT SELECT 語句(關於這條語句的詳細介紹,請參閱 如何使用 SQL INSERT 語句將數據插入到表中)從舊表複製數據到新表。有必要的話,可以使用轉換函數和計算欄位;

(3) 檢驗包含所需數據的新表;

(4) 重命名舊表(如果確定,可以刪除它);

(5) 用舊表原來的名字重命名新表;

(6) 根據需要,重新創建觸發器、存儲過程、索引和外鍵。

說明:ALTER TABLE 和 SQLite

SQLite 對使用 ALTER TABLE 執行的操作有所限制。最重要的一個限制是,它不支持使用 ALTER TABLE 定義主鍵和外鍵,這些必須在最初創建表時指定。

註意:小心使用 ALTER TABLE

使用 ALTER TABLE 要極為小心,應該在進行改動前做完整的備份(表結構和數據的備份)。

資料庫表的更改不能撤銷,如果增加了不需要的列,也許無法刪除它們。類似地,如果刪除了不應該刪除的列,可能會丟失該列中的所有數據。

三、刪除表

刪除表(刪除整個表而不是其內容)非常簡單,使用 DROP TABLE 語句即可:

DROP TABLE CustCopy;

這條語句刪除 CustCopy 表(如何使用 SQL INSERT 語句將數據插入到表中 中創建的)。刪除表沒有確認步驟,也不能撤銷,執行這條語句將永久刪除該表。

提示:使用關係規則防止意外刪除

許多 DBMS 允許強制實施有關規則,防止刪除與其他表相關聯的表。

在實施這些規則時,如果對某個表發佈一條 DROP TABLE 語句,且該表是某個關係的組成部分,則 DBMS 將阻止這條語句執行,直到該關係被刪除為止。

如果允許,應該啟用這些選項,它能防止意外刪除有用的表。

四、重命名錶

每個 DBMS 對錶重命名的支持有所不同。對於這個操作,不存在嚴格的標準。

DB2、MariaDB、MySQL、Oracle 和 PostgreSQL 用戶使用 RENAME 語句,SQL Server 用戶使用 sp_rename 存儲過程,SQLite 用戶使用 ALTER TABLE 語句。

所有重命名操作的基本語法都要求指定舊表名和新表名。不過,存在 DBMS 實現差異。關於具體的語法,請參閱相應的 DBMS 文檔。

五、小結

本文介紹了幾條新的 SQL 語句。

CREATE TABLE 用來創建新表,ALTER TABLE 用來更改表列(或其他諸如約束或索引等對象),而 DROP TABLE 用來完整地刪除一個表。

這些語句必須小心使用,並且應該在備份後使用。由於這些語句的語法在不同的 DBMS 中有所不同,所以更詳細的信息請參閱相應的 DBMS 文檔。

原文鏈接:https://www.developerastrid.com/sql/sql-create-table/

(完)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 導讀: 隨著全球數據量的不斷增長,越來越多的業務需要支撐高併發、高可用、可擴展、以及海量的數據存儲,在這種情況下,適應各種場景的數據存儲技術也不斷的產生和發展。與此同時,各種資料庫之間的同步與轉化的需求也不斷增多,數據集成成為大數據領域的熱門方向,於是SeaTunnel應運而生。SeaTunnel是 ...
  • hive 存儲格式有很多,但常用的一般是 TextFile、ORC、Parquet 格式,在我們單位最多的也是這三種 hive 預設的文件存儲格式是 TextFile。 除 TextFile 外的其他格式的表不能直接從本地文件導入數據,要先導入到 TextFile 格式的表中,再從表中用 inser ...
  • 本文介紹 SQL 所涉及的幾個數據處理特性:約束、索引和觸發器。約束是實施引用完整性的重要部分,索引可改善數據檢索的性能,觸發器可以用來執行運行前後的處理。 一、約束 SQL 已經改進過多個版本,成為非常完善和強大的語言。許多強有力的特性給用戶提供了高級的數據處理技術,如約束。 關聯表和引用完整性已 ...
  • 本文介紹什麼是 SQL 游標,為什麼使用游標,如何使用游標。你使用的 DBMS 可能會提供某種形式的游標,以及這裡沒有提及的功能。更詳細的內容請參閱具體的 DBMS 文檔。 一、游標 SQL 檢索操作返回一組稱為結果集的行,這組返回的行都是與 SQL 語句相匹配的行(零行到多行)。 簡單地使用 SE ...
  • 本文介紹什麼是 SQL 事務處理,如何利用 COMMIT 和 ROLLBACK 語句對何時寫數據、何時撤銷進行明確的管理;還學習瞭如何使用保留點,更好地控制回退操作。 一、事務處理 使用事務處理(transaction processing),通過確保成批的 SQL 操作要麼完全執行,要麼完全不執行 ...
  • 本文介紹什麼是 SQL 存儲過程,為什麼要使用存儲過程,如何使用存儲過程,以及創建和使用存儲過程的基本語法。 一、存儲過程 迄今為止,我們使用的大多數 SQL 語句都是針對一個或多個表的單條語句。並非所有操作都這麼簡單,經常會有一些複雜的操作需要多條語句才能完成,例如以下的情形。 為了處理訂單,必須 ...
  • 大家好,我是大D。 今天開始給大家分享關於大數據入門技術棧——Hadoop的學習內容。 初識 Hadoop 為瞭解決大數據中海量數據的存儲與計算問題,Hadoop 提供了一套分散式系統基礎架構,核心內容包含HDFS ( Hadoop Distributed File System, 分散式文件系統) ...
  • 本文介紹什麼是 SQL 視圖,它們怎樣工作,何時使用它們。視圖提供了一種封裝 SELECT 語句的層次,可用來簡化數據處理,重新格式化或保護基礎數據。 一、視圖 視圖是虛擬的表。與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢。 說明:SQLite 的視圖 SQLite 僅支持只讀視圖,所以 ...
一周排行
    -Advertisement-
    Play Games
  • 什麼是工廠模式 工廠模式是最常用的設計模式之一,屬於創建型模式。 有點: 解耦,可以把對象的創建和過程分開 減少代碼量,易於維護 什麼時候用? 當一個抽象類有多個實現的時候,需要多次實例化的時候,就要考慮使用工廠模式。 比如:登錄的抽象類ILoginBusiness,它有2個實現,一個用用戶名密碼登 ...
  • 這次iNeuOS升級主要升級圖形渲染引擎和增加豐富的圖元信息,可以很快的方案應用。總共增加41個通用和行業領域的圖元應用,增加2154個圖元信息,現在iNeuOS視圖建模功能模塊總共包括5894個行業圖元信息。現在完全支持製作高保真的工藝流程和大屏展示效果。 ...
  • 效果圖先附上: 首先 這是我是參考 教程:使用 SignalR 2 和 MVC 5 實時聊天 | Microsoft Docs 先附上教程: 在“添加新項 - SignalRChat”中,選擇 InstalledVisual> C#>WebSignalR>,然後選擇 SignalR Hub 類 (v ...
  • 一、前言 項目中之前涉及到胎兒心率圖曲線的繪製,最近項目中還需要添加心電曲線和血樣曲線的繪製功能。今天就來分享一下心電曲線的繪製方式; 二、正文 1、胎兒心率曲線的繪製是通過DrawingVisual來實現的,這裡的心電曲線我也是採用差不多相同的方式來實現的,只是兩者曲線的數據有所區別。心電圖的數據 ...
  • 安裝 Redis # 首先安裝依賴gcc, 後面需要使用make編譯redis yum install gcc -y # 進入 /usr/local/src 目錄, 把源碼下載到這裡 cd /usr/local/src # 下載 redis 7.0.2 的源碼,github被牆,可以使用國內的地址 ...
  • Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...
  • 事情的起因是收到了一位網友的請求,他的java課設需要設計實現迷宮相關的程式——如標題概括。 我這邊不方便透露相關信息,就只把任務要求寫出來。 演示視頻指路👉: 基於JavaFX圖形界面的迷宮程式演示_嗶哩嗶哩_bilibili 完整代碼鏈接🔎: 網盤:https://pan.baidu.com ...
  • Python中的字典 Python中的字典是另一種可變容器模型,且可存儲任意類型對象。鍵值使用冒號分割,你可以看成是一串json。 常用方法 獲取字典中的值 dict[key] 如果key不存在會報錯,建議使用dict.get(key),不存在返回None 修改和新建字典值 dict[key]=va ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“加班使我快樂”。 面試官: 看你簡歷上用過MySQL,問你幾個簡單的問題吧。什麼是聚簇索引和非聚簇索引? 這個問題難不住我啊。來之前我看一下一燈M ...
  • tunm二進位協議在python上的實現 tunm是一種對標JSON的二進位協議, 支持JSON的所有類型的動態組合 支持的數據類型 基本支持的類型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "s ...