成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MySQL——約束

lyning / 2050人閱讀

摘要:其它操作刪除主鍵約束表名添加主鍵表名列名修改列為主鍵表名列名數(shù)據(jù)類型外鍵約束外鍵約束是保證一個(gè)或兩個(gè)表之間的參照完整性保持?jǐn)?shù)據(jù)一致性。

一. 關(guān)系型數(shù)據(jù)庫

市場(chǎng)上主流的關(guān)系型數(shù)據(jù)庫:Oracle、DB2、Sybase 、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。
關(guān)系型數(shù)據(jù)庫有三大完整性:

實(shí)體完整性:實(shí)體屬性中的標(biāo)識(shí)屬性不能為空、不能重復(fù),該約束通過制定的主鍵實(shí)現(xiàn),其約束有系統(tǒng)強(qiáng)制實(shí)施

參照完整性:實(shí)體中的外鍵可以為空,但不能是錯(cuò)的。

用戶定義完整性:某一具體的實(shí)際數(shù)據(jù)庫的約束條件,由應(yīng)用環(huán)境所決定,反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的要求。(例如定義某一行不能為空)

約束主要完成對(duì)數(shù)據(jù)的檢驗(yàn)限制,從而保證數(shù)據(jù)庫的完整性。

二.約束 1.主鍵約束(PRIMARY KEY)

主鍵約束列不允許重復(fù),即任意兩行的主鍵值都不相同;每行都具有一個(gè)主鍵值,也不允許出現(xiàn)空值;

單列主鍵

創(chuàng)建有兩種方式:
一種是直接對(duì)字段加primary key關(guān)鍵字:

CREATE TABLE student(
          id INT PRIMARY KEY,         
          name VARCHAR(20),          
          )

另外一種是通過額外加約束的方式:

CREATE TABLE student(
          id INT NOT NULL,         
          name VARCHAR(20), 
         CONSTRAINT PK_STUD_ID PRIMARY KEY(id)
         //PK_STUD_ID為約束的名字          
          )
聯(lián)合主鍵

有時(shí)候一個(gè)列的字段可能有重復(fù),可以聯(lián)合多個(gè)列設(shè)為主鍵。

CREATE TABLE student(       
          name VARCHAR(20),
          class VARCHAR(20),
         CONSTRAINT PK_STUD_ID PRIMARY KEY(name,class)       
          )
其它操作
//刪除主鍵約束  
ALTER TABLE 表名 DROP PRIMARY KEY;    
//添加主鍵  
ALTER TABLE 表名 ADD PRIMARY KEY(列名);    
//修改列為主鍵
ALTER TABLE 表名 MODIFY 列名 數(shù)據(jù)類型 PRIMARY KEY;
2.外鍵約束(FOREIGN KEY)

外鍵約束是保證一個(gè)或兩個(gè)表之間的參照完整性,保持?jǐn)?shù)據(jù)一致性。表的外鍵可以是另一表的主鍵(也可以是唯一索引,詳情看這里), 外鍵可以有重復(fù)的, 可以是空值。實(shí)現(xiàn)一對(duì)一或一對(duì)多關(guān)系。

創(chuàng)建外鍵約束
CREATE TABLE classes(
          id INT AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(20) 
          );  
//第一種:添加關(guān)鍵字
CREATE TABLE student(
          id INT AUTO_INCREMENT,         
          name VARCHAR(20),          
          CONSTRAINT PK_ID PRIMARY KEY(id),                        
          class_id INT REFERENCES classes(id) 
          )
//第二種:額外聲明
CREATE TABLE student(
          id INT AUTO_INCREMENT,         
          name VARCHAR(20),          
          CONSTRAINT PK_ID PRIMARY KEY(id),                        
          class_id INT,
          CONSTRAINT fk_class_id FOREIGN KEY(classe_id) REFERENCES classes(id)
          )
外鍵約束的要求

父表和子表必須使用相同的存儲(chǔ)引擎,而且禁止使用臨時(shí)表

數(shù)據(jù)表的存儲(chǔ)引擎只能為InnoDB,default-storage-engine-INNODB

外鍵列和參照列必須具有相似的數(shù)據(jù)類型,數(shù)字的長度或是有符號(hào)位必須相同,而字符 的長度可以不同

外鍵列和參照列必須創(chuàng)建索引,如果外鍵列不存在索引的話,MySQL將自動(dòng)創(chuàng)建索引。
設(shè)定參照列:FOREIGN KEY(id) PEFERENCES provinces(id)

外鍵約束的參照操作

CASCADE:從父表刪除或更新且自動(dòng)刪除或更新子表中匹配的行

SET NULL:從父表刪除或更新行,并設(shè)置子表中的外鍵列為NULL,如果使用該選項(xiàng),必須保證子表列沒有指定NOT NULL

RESTRICT:拒絕對(duì)父表的刪除或更新操作

NO ACTION:標(biāo)準(zhǔn)SQL的關(guān)鍵字,在MySQL中與RESTRICT相同

其它操作
//刪除外鍵約束
 ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名;
(創(chuàng)建外鍵的方法沒有指定約束名稱,系統(tǒng)會(huì)默認(rèn)給外鍵約束分配外鍵約束名稱,命名為student_ibfk_n)

//增加外鍵約束 
 ALTER TABLE 表名 ADD FOREIGN KEY 列名 REFERENCES 父表(對(duì)應(yīng)列名);
3.唯一約束(UNIQUE)

指定表中某一列或多個(gè)列不能有相同的兩行或者兩行以上的數(shù)據(jù)存在,

唯一約束可以保證記錄的唯一性

唯一約束的字段可以為空值(允許的空值有多個(gè),但是最終存儲(chǔ)的只有一個(gè))

每張數(shù)據(jù)表可以存在多個(gè)唯一約束

UNIQUE KEY的用途:主要是用來防止數(shù)據(jù)插入的時(shí)候重復(fù)。

CREATE TABLE student
(
  name CHAR(20) UNIQUE KEY
 );

為表中列添加UNIQUE KEY

ALTER TABLE student MODIFY CHAR(20) UNIQUE KEY; 
4.非空約束(NOT NULL)

輸入值必須是非空的,需要注意的是允許控制盡量不要太多,太多會(huì)更消耗數(shù)據(jù)庫性能。

CREATE TABLE student
(
  name CHAR(20) NOT NULL
 );
5.默認(rèn)約束(DEFAULT)

默認(rèn)約束有以下的要求:

定義的常量必須與該列的數(shù)據(jù)類型、精度等匹配

每個(gè)列只能定義一個(gè)DEFAULT約束

DEFAULT約束會(huì)在使用INSERT語句

這里需要說明的是,DEFAULT后面不能像SQL Server那樣使用函數(shù),后面只能是一個(gè)常量。官方文檔原文:

With one exception, the default value must be a constant; it cannot be a function or an expression.

如果我們想要獲取當(dāng)前的時(shí)間,可以使用CURRENT_TIMESTAMP

CREATE TABLE student
(
   joinTime DATETIME DEFAULT CURRENT_TIMESTAMP
 );
6.CHECK約束

CHECK約束,驗(yàn)證數(shù)據(jù),比如性別中只能為女或男,而不能為其它。MySQL不支持check約束,但可以使用check約束,就是沒有任何效果。

三.參考資料

《大話數(shù)據(jù)庫》

MySQL 5.7 Reference Manual

Set NOW() as Default Value for datetime datatype?

IMOOC課程:《與MySQL的零距離接觸》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17554.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<