DDL創建資料庫,表以及約束(極客時間學習筆記)

来源:https://www.cnblogs.com/wadmwz/archive/2019/06/23/11073320.html
-Advertisement-
Play Games

DDL DDL是DBMS的核心組件,是SQL的重要組成部分. DDL的正確性和穩定性是整個SQL髮型的重要基礎. DDL的基礎語法及設計工具 DDL的英文是Data Definition Language,也就是數據定義語言.定義了資料庫的結構和數據表的結構.常用的功能急救室增刪改,對應的命令分別是 ...


DDL

DDL是DBMS的核心組件,是SQL的重要組成部分. DDL的正確性和穩定性是整個SQL髮型的重要基礎.

DDL的基礎語法及設計工具

DDL的英文是Data Definition Language,也就是數據定義語言.定義了資料庫的結構和數據表的結構.常用的功能急救室增刪改,對應的命令分別是CREATE、DROP和ALTER.

  1. 對資料庫進行定義
CREATE DATABASE nba; // 創建名為nba的資料庫
DROP DATABASE nba; // 刪除名為nba的資料庫
  1. 對數據表進行定義
CREATE TABLE table_name; // 創建表,table_name指表名

創建表的結構呢? 舉個實際的例子, 我們創建一個球員表, 表名為player, 裡面有兩個欄位, 一個是player_id, 它是int類型,另一個是player_name欄位是varchar(255)類型, 兩個欄位都不能為空, 並且player_id是遞增的.

接下來創建表的語句這麼就是:

CREATE TABLE player(
    player_id int(11) NOT NULL AUTO_INCREMENT,
    player_name varchar(255) NOT NULL
);

註意的是每個欄位定義的語句最後使用 , 作為結束符, 最後一個欄位的定義結束之後沒有逗號的 , 並且語句最後是以 ; 結尾的. 數據類型中int(11)代表整數類型, 顯示長度是11位, 括弧中的參數11代表的是最大有效顯示長度, 與類型包含的數值大小無關. varchar(255)代表的是最大長度為255的可變字元串類型. NOT NULL表名整個欄位不能為空值,是一種數據約束. AUTO_INCREMENT代表主鍵自動增長.(一般情況下使用可視化工具類創建和操作資料庫和資料庫表,比如Navicat)

接下來針對player表,設計下麵欄位:

其中player_id是數據表player的主鍵, 且自動增長, 也就是player_id會從1開始, 然後每次加一, 不必為它賦值. player_id、team_id、player_name這三個欄位均不為空, height欄位可以為空.

使用Navicat工具創建表並導出的SQL文件如下所示:

DROP TABLE IF EXISTS `player`;
CREATE TABLE `player`(
    `player_id` int(11) NOT NULL AUTO_INCREMENT,
    `team_id` int(11) NOT NULL,
    `team_name` varchar(255) CHARACTER SET utf8 collate utf8_general_ci NOT NULL ,
    `height` float(3,2) NULL DEFAULT0.00,
    PRIMARY KEY(`player_id`) USING BTREE,
    UNIQUE INDEX `player_name`(`player_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

可以看到整個SQL文件中的DDL處理, 首先刪除player表(如果資料庫中存在該表的話), 然後再創建player表, 裡面的欄位名和表名都使用了反引號,這是為了避免名稱與MYSQL保留欄位相同,對資料庫表和欄位名都加上反引號.

其中player_name欄位的字元集是utf8, 排序規則是utf8_general_ci, 代表對大小寫不敏感, 如果設置為utf8_bin, 表示對大小寫敏感.

因為player_id設置為了主鍵, 所以在DDL中使用PRIMARY KEY進行規定,同時索引方法採用BTREE.

對player_name欄位進行索引, 在設置索引時, 可以設置UNIQUE INDEX(唯一索引), 也可以設置為其它索引方式, 比如NORMAL INDEX(普通索引), 這裡我們採用UNIQUE INDEX. 唯一索引和普通索引的區別在於對欄位進行了唯一性約束. 在索引方式上, 可以選擇BTREE和HASH, 這裡採用BTREE方法進行索引.

整個數據表的存儲規則採用InnoDB, 是MYSQL5.5之後的預設存儲引擎, 將字元集設置為utf8, 排序規則設置為utf8_general_ci, 行格式為Dynamic, 就可以定義數據表的最後約定了:

ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

修改表結構

創建完表之後, 可以對錶結構進行修改, 使用DDL命令來完成.

  1. 添加欄位
ALTER TABLE player ADD (age int(11));
  1. 修改欄位名, 將age欄位改成player_age
ALTER TABLE player RENAME COLUMN age to player_age;
  1. 修改欄位的數據類型
ALTER TABLE player MODIFT (player_age float(3,1));
  1. 刪除欄位, 刪除剛纔添加的player_age欄位
ALTER TABLE player DROP CLOUMN player_age;

數據表的常見約束

在創建數據表的時候, 會對欄位進行約束, 約束的目的在於保證RDBMS裡面的數據的準確性和一致性.

  1. 主鍵約束

主鍵起的作用是唯一標識一條記錄, 不能重覆, 不能為空, 即UNIQUE + NOT NULL. 一個數據表的主鍵只能有一個. 但是主鍵可以是一個欄位, 也可以是多個欄位符合組成. 上面的player_id就是主鍵.

  1. 外鍵約束

外鍵起的作用是確保表與表之間引用的完整性. 一個表中的外鍵對應了另外一張表中的主鍵. 外鍵可以重覆並且可以為空. 比如player_id是player表的主鍵,如果想設置一個球員比分表player_score, 可以再player_score中設置player_id為外鍵,關聯到player表.

  1. 唯一約束

唯一約束就是表明欄位在表中的數值唯一, 主要是對除主鍵以外的其他欄位(主鍵自帶數值唯一BUFF). 上面對player_name進行了唯一性約束,也就是說球員的姓名不能相同. 註意的是唯一性約束和普通索引(NORMAL INDEX)之間的區別: 唯一性約束相當於創建了一個約束和普通索引, 目的是保證欄位的正確性, 而普通索引只是提升數據檢索的速度, 並不對欄位的唯一性進行約束.

  1. NOT NULL約束

對欄位定義了NOT NULL, 表明欄位不能為空, 必須有取值.

  1. DEFAULT

表明欄位的預設值, 如果在插入數據的時候該欄位沒有取值, 就設置為預設值.

  1. CHECK約束

用來檢查特定欄位取值範圍的有效性, CHECK約束的結果不能為FALSE.

設計數據表的原則

"三少一多的原則":

  1. 數據表的個數越少越好

RDBMS的核心在於對實體和聯繫的定義, 也就是E-R圖(Entity Relation Diagram), 數據表越少, 說明實體和聯繫設計得越簡潔, 即方便理解有方便操作.

  1. 數據表中的欄位個數越少越好

欄位個數越多, 數據冗餘的可能性越大. 設置欄位個數少的前提是各個欄位相互獨立, 而不是某個欄位的取值可以由其它欄位計算出來. 當然欄位個數少是相對的, 通常會在數據冗餘和檢索效率中進行平衡.

  1. 數據表中聯合主鍵的欄位個數越少越好

設置主鍵是為了確定唯一性, 當一個欄位無法確定唯一性, 就需要採用聯合主鍵的方式. 聯合主鍵中的欄位越多, 占用的所以索引空間越大, 會加大理解難度, 會增加運行時間和索引空間.

  1. 使用主鍵和外鍵越多越好

資料庫的設計實際上就是定義各種表, 一級各種欄位間的關係, 關係越多, 證明實體之間的冗餘度越低, 利用度越高, 這樣做的好處在於不僅保證數據表之間的獨立性, 還能提升相互之間的關聯使用率. (不過在我現在的公司, 基本上沒有使用外鍵, 不知道是因為影響效率還是什麼, 外鍵的意義起不到作用)

作者的意思是大型項目中後期,可以採用業務層來實現,取消外鍵提高效率。不過在SQL學習之初,包括在系統最初設計的時候,還是建議你採用規範的資料庫設計,也就是採用外鍵來對數據表進行約束。因為這樣可以建立一個強一致性,可靠性高的資料庫結構,也不需要在業務層來實現過多的檢查。當然在項目後期,業務量增大的情況下,你需要更多考慮到資料庫性能問題,可以取消外鍵的約束,轉移到業務層來實現。而且在大型互聯網項目中,考慮到分庫分表的情況,也會降低外鍵的使用。

建議是 不過在SQL學習,以及項目早期,還是建議你使用外鍵。在項目後期,你可以分析有哪些外鍵造成了過多的性能消耗。一般遵循2/8原則,會有20%的外鍵造成80%的資源效率,你可以只把這20%的外鍵進行開放,採用業務層邏輯來進行實現,當然你需要保證業務層的實現沒有錯誤。不同階段,考慮的問題不同。當用戶和業務量增大的時候,對於大型互聯網應用,也會通過減少外鍵的使用,來減低死鎖發生的概率,提高併發處理能力。


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

-Advertisement-
Play Games
更多相關文章
  • 首先大數據這個趨勢已經很明瞭,但是進入這個領域有門檻,而且不小,要有心理準備,自學要因人而異,沒有基礎的前提下,有難度,後面我會給你一些學習的建議。 ...
  • 五、數據查詢語言(DQL) (重中之重) 六、事務控制語言(TCL) ...
  • 1、set key value //設置、修改值 2、get key //如果key不存在,返回nil,表示空。 3、type key //返回key對應的value的數據類型 4、rename key newKey //重命名key,即修改鍵的名稱。當key和newKey重名時,或者key不存在時 ...
  • redis.windows.conf中的部分參數說明 redis.windows.conf配置的是Redis伺服器。 bind 127.0.0.1 //設置Redis伺服器的ip地址 port 6379 //指定埠號 timeout 300 //當客戶端閑置多長時間後關閉連接,如果指定為 0,表示 ...
  • 一、資料庫基本概念 1、關係資料庫 (1)關係操作 關係操作所操作的對象和結果都是集合,成為一次一集合的方式。而非關係數據模型的資料庫操作方式為一次一記錄的方式。 關係數據模型中最重要的是關係查詢操作,主要分為:選擇(select)、投影(project)、連接(jion)、除(divide)、並( ...
  • -- 聚集函數(方便分析和報表生成,其實也就是進行簡單的統計學的處理,不需要返回原表來浪費時間)/* 比如:1.確定表中某些行數(或者滿足某個條件或包含某個特定值的行數) 2.獲得表中某些行的和 3.找出表列(或所有行或某些特定的行)的最大值、最小值、平均值 (在各種主要SQL實現中得到了相當一致的 ...
  • 一、新增一個普通用戶bigdata 設置bigdata用戶具有root許可權 二、配置靜態ip 若機器為克隆的則該文件下存在多個物理地址, 刪除eth0該行;將eth1修改為eth0,同時記住物理ip地址 三、修改主機名 四、關閉防火牆 1)查看防火牆開機啟動狀態 2)關閉防火牆 五、在opt目錄下創 ...
  • /* 函數處理數據的一個問題就是每個DBMS都有特定的函數,在不同的DBMS中,各個函數的名稱和語法可能極其不同這意味著特定SQL實現編寫的代碼在其他視線中可能不正常*/ -- 在MySQL中: /* 提取字元串的組成部分 SUBSTRING()數據類型轉換 CONVERT()取當前日期 CURDA ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...