如何使用 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...