如何使用 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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...