MySQL從刪庫到跑路_高級(一)——數據完整性

来源:https://www.cnblogs.com/cxydczzl/archive/2018/10/08/9755340.html
-Advertisement-
Play Games

作者:天山老妖S 鏈接:http://blog.51cto.com/9291927 一、數據完整性簡介 1、數據完整性簡介 數據冗餘是指資料庫中存在一些重覆的數據,數據完整性是指資料庫中的數據能夠正確反應實際情況。數據的完整性是指數據的可靠性和準確性,數據完整性類型有四種:A、實體完整性:實體的完整 ...


作者:天山老妖S

鏈接:http://blog.51cto.com/9291927

一、數據完整性簡介

1、數據完整性簡介

數據冗餘是指資料庫中存在一些重覆的數據,數據完整性是指資料庫中的數據能夠正確反應實際情況。
數據的完整性是指數據的可靠性和準確性,數據完整性類型有四種:
A、實體完整性:實體的完整性強製表的標識符列或主鍵的完整性(通過唯一約束,主鍵約束或標識列屬性)。
B、域完整性:限制類型(數據類型),格式(通過檢查約束和規則),可能值範圍(通過外鍵約束,檢查約束,預設值定義,非空約束和規則)。
C、引用完整性:在刪除和輸入記錄時,引用完整性保持表之間已定義的關係。引用完整性確保鍵值在所有表中一致,不能引用不存在的值.如果一個鍵。
D、自定義完整性:用戶自己定義的業務規則,比如使用觸發器實現自定義業務規則。

2、數據完整性實現方式


MySQL不支持Check約束,雖然可以在列上添加check約束,但不起作用。

二、實體完整性實現

1、實體完整性的實現簡介

實體完整性的實現有兩種方式:
A、主鍵約束:一張表只能有一列設置主鍵,值必須唯一,不允許為空,innoDB存儲引擎,主鍵就是索引。
B、唯一值約束:一張表可以有多個列添加唯一值約束,一直允許一條記錄為空值。
實體完整性,由主鍵和唯一性約束來實現,確保表中記錄有一列唯一標識。主鍵又分為Primary key 和AUTO_INCREMENT PRIMARY KEY兩種。

2、主鍵

MySQL的主鍵名總是PRIMARY, 當創建主鍵約束時,如果表的存儲引擎是innoDB,系統預設會在所在的列和列組合上建立對應的唯一索引。
主鍵約束相當於唯一約束與非空約束的組合,主鍵約束列不允許重覆,也不允許出現空值;多列組合的主鍵約束,列都不允許為空值,並且組合的值不允許重覆。每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別上創建。
A、創建表時指定主鍵
創建表時指定主鍵的方式一:

create table product
 (
 productID int PRIMARY KEY,
 pName VARCHAR(10),
 price DOUBLE
 )ENGINE=MyISAM default CHARSET=utf8;

創建表時指定主鍵的方式二:

create table product
 (
 productID int,
 pName VARCHAR(10),
 price DOUBLE, CONSTRAINT pk_s_productID PRIMARY KEY(productID)
 )ENGINE=MyISAM default CHARSET=utf8;

在指定主鍵的表中插入記錄時,不允許插入重覆的ID,如果不指定主鍵的值,預設為0。
MyISAM類型的存儲引擎不會在主鍵列上創建索引,表中記錄的存儲順序與插入順序相同。


InnoDB存儲引擎會自動在主鍵列上創建索引,插入的記錄會根據主鍵的值的順序排放。
alter table product ENGINE=InnoDB;


B、增加主鍵
alter table TStudent add primary key(studentid);
C、刪除主鍵
alter table TStudent drop primary key;

3、自增主鍵

AUTO_INCREMENT PRIMARY KEY
如果不指定主鍵值,會自動在現有主鍵值的最大值上自動增加1作為新記錄的主鍵,主鍵值預設從1開始。可以在數據數據類型整數型的列上添加自增主鍵。


A、創建表時指定自增自增列

create table product
 (
 productID int PRIMARY KEY AUTO_INCREMENT not NULL,
 pName VARCHAR(10),
 price DOUBLE
 )ENGINE=MyISAM default CHARSET=utf8;

B、為現有的表指定自增列
alter table TStudent modify column studentID int PRIMARY KEY AUTO_INCREMENT;

C、刪除表中自增列
alter table TStudent modify column studentID int not NULL;
刪除自增列,仍然時主鍵,但是沒有自增長功能

4、複合主鍵

使用表的兩列或多列創建主鍵。
A、創建表時指定複合主鍵

create table student
 (
 studentID int, id INT,
 sname VARCHAR(10),
 score int,
 PRIMARY KEY(studentid,id)
 )ENGINE=MyISAM default CHARSET=utf8;

B、給表增加複合主鍵
alter table student add PRIMARY KEY(sudentID,id);
C、刪除複合主鍵
alter table student drop PRIMARY KEY;

5、唯一約束

UNIQUE KEY,唯一約束,指定某列和幾列組合的數據不能重覆。
A、創建表時指定唯一性約束

create table score
 (sname VARCHAR(10) UNIQUE,
 score int not NULL
 );

B、給現有列增加唯一性約束
alter table score add CONSTRAINT uc_sname UNIQUE(sname);
如果表中現有記錄有重覆值,不允許添加唯一性約束。可以通過聚合函數,查找有重覆值的記錄,刪除,再創建唯一性約束。
C、創建複合唯一性約束

create table student
 (
 studentID int, id INT,
 sname VARCHAR(10),
 score int, CONSTRAINT uc_id UNIQUE(studentID, id)
 )ENGINE=MyISAM default CHARSET=utf8;

D、刪除列的唯一性約束
alter table score drop index uc_sname;

三、域完整性

1、預設值

在表中插入一條新的記錄時,如果沒有為該欄位賦值,那麼資料庫系統會自動為該欄位賦一條預設值。

create table st
(sid INT not null primary key auto_increment,
sname varchar(10),
subject varchar(20) default '軟體工程',
entertime TIMESTAMP default now()
);

給表中一列添加預設值約束:
alter table st modify column subject VARCHAR(20) default '電腦科學與技術';
刪除表中一列的預設值約束:
alter table st modify column subject VARCHAR(20) default NULL;

2、創建非空約束

非空約束用於確保當前列的值不為空值,非空約束只能出現在表對象的列上。 
Null類型特征: 所有的類型的值都可以是null,包括int、float等數據類型 空字元串是不等於NULL,0也不等於NULL。
A、創建表時給列指定非空約束

create table score
 (sname VARCHAR(10) not NULL,
 score int not NULL
 );

B、給指定列指定非空約束
alter table score modify column score int not NULL;
C、刪除非空約束
alter table score modify column score int;

3、檢查check

check關鍵字,在插入新行或者更改已有行時才起作用,作用是阻止不滿足條件的值進入該列,對null值無效,因為插入null就相當於沒有插入。一個列可有多個check。
age int check(age between 10 and 20);
目前MySQL不支持check約束,微軟MSSQL支持Check約束,但創建表時可以指定Check約束,但不起作用。

四、參照完整性

1、參照完整性簡介

MySQL參照完整性一般是通過MySQL外鍵(foreign key)實現的。
外鍵(僅innoDB支持)所引用表的列必須是主鍵。
外鍵聲明包括三個部分:
A、哪個列或列組合是外鍵
B、指定外鍵參照的表和列
C、參照動作[cascade(級聯操作),restrict(拒絕操作),set null(設為空),no action,set default]。
如果外鍵約束指定了參照動作,主表記錄做修改,刪除,從表引用的列會做相應修改,或不修改,拒絕修改或設置為預設值。
引用表的列名必須是主鍵,且在刪除引用表時必須刪除引用關係或者刪除當前表。

2、創建表時指定外鍵

創建兩張表,學生表student和成績表score,成績表的sid列的取值參照學生表(學生表student的sid列設置為主鍵,且表的存儲引擎為innodb,成績表score的存儲引擎也必須設置為innodb)。

create table student
(sid int not null primary key,
sname varchar(20)
) engine=innodb;create table score
(sid int not null,
mark INT,constraint score_fk FOREIGN KEY (sid)references student(sid) on delete cascade on update cascade) engine=innodb;

在學生表插入一條記錄
insert into student values (1,'孫悟空')
在成績表插入一條記錄,學號是1,成功。
insert into score values (1,98)
在成績表插入一條記錄,學號是2,失敗。
insert into score values (2,88)
在學生表插入學號是2的一條記錄
insert into student values (2,'唐僧')
再在成績表插入一條學號是2的記錄,成功,證明外鍵參照成功。
insert into score values (2,88);

3、刪除參照約束

ALTER TABLEscoreDROP FOREIGN KEYscore_fk;

4、給現有表增加參照約束

ALTER TABLEscoreADD CONSTRAINTscore_fk2FOREIGN KEY (sid

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

-Advertisement-
Play Games
更多相關文章
  • 正則表達式(Regular Expression,通常簡稱為 regex 或 RE)是一種表達方式,可以用它來查找匹配特定准則的文本。在許多編程語言中都有用到正則表達式,常用它來實現一些複雜的匹配。這裡簡單介紹一下 shell 中常用到的一些正則表達式。 一、什麼是正則表達式 正則表達式是對字元串進 ...
  • 查看版本:select version();顯示當前時間:select now();註意:在語句結尾要使用分號;遠程連接一般在公司開發中,可能會將資料庫統一搭建在一臺伺服器上,所有開發人員共用一個資料庫,而不是在自己的電腦中配置一個資料庫運行命令mysql -hip地址 -uroot -p-h後面寫... ...
  • 是由JS引擎的限製造成的。 MapReduce的結果無法寫入到一個被Sharding的Collection中,2.0版本對這個問題的解決好像也不徹底; 對於數組型的數據操作不夠豐富. 文章資源下載地址 "https://www.slidestalk.com/s/mongodb_zixvrv" ...
  • 軟體:CentOS-7 VMware12 SSHSecureShellClient shell工具:Xshell 規劃 vm網路配置 01.基礎配置 02.ssh配置 03.zookeeper配置 04.hadoop配置 05.mysql配置_單節點 06.hbase配置 07.hive配置 08. ...
  • Oracle入門 進入Oracle 連接Oracle資料庫 \ sqlplus 不登錄鏈接資料庫: sqlplus /nolog 預設sqlplus不能上下頁翻頁,可通過安裝rlwrap解決,安裝步驟: \ ./configer \ make \ make install 登錄帳號: 自帶測試帳號: ...
  • mysql提供了一個特別的explain語句,用來分析查詢語句的性能 : explain select ... 1.在所有用於where,order by,group by的列上添加索引 創建索引 2.用union優化like語句 當or關鍵字在where子句中使用頻率過高時,它可能會使mysql優 ...
  • 玩北京賽車不僅心態要好,還需要註意投註的精確計算與風險測試,有了這些數據支持之後,再加上我自己獨特的投註技巧,現在在玩賽車的過程中已經能做到贏多輸少,贏大輸小,長期下來持續穩定盈利,創造了很多記錄。這套方法是我玩彩到現在以來見過的、用過的最穩妥的方法,也有自己很多的技術成分在裡面。想玩好北京賽車,我... ...
  • 轉自:http://www.maomao365.com/?p=7141 摘要: 下文講述sql腳本編寫中,將 特定值排在最前面的方法分享, 實驗環境:sqlserver 2008 R2 例:將數據表中指定值為0的行排在最前面呈現給用戶 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...