如何使用 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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...