MySQL實戰10 約束

MySQL實戰 目錄

前言

約束:限制,限制我們表中的數據,保證添加到數據表中的數據準確和可靠性!凡事不符合約束的數據,插入時就會失敗,插入不進去的!
比如:學生信息表中,學號就會約束不可重復!

1.約束基本概念

1.1.約束的分類:
  • not null:非空約束,保證值不能為空
  • default:默認約束,保證字段會有默認值,即時沒有插入值,都會有默認值。
  • primary key:主鍵約束,同時保證唯一性非空
  • unique:唯一,保證唯一性但是可以為空
  • check:檢查性約束【MySQL不支持,語法不報錯,但無效】
  • foreign key:外鍵約束,用于限制兩個表的關系,保證從表該字段的值必須來自于
    主表相關聯的字段的值,不能無中生有!

比如:員工信息表中的"部門編號"的值,就必須有外鍵約束。

1.2.添加約束的時期:

創建表的時候
修改表的時候

1.3.約束的添加分類:
1.3.1列級約束

6種約束可以寫,語法都支持,不報錯,但外鍵約束寫了等于白寫

1.3.2表級約束

not null 非空、default默認不支持,其他都可以!

DROP TABLE IF EXISTS students;
CREATE TABLE students(
    id INT PRIMARY KEY,#主鍵約束
        s_name VARCHAR(10) NOT NULL,#非空約束
        s_sex CHAR(1) NOT NULL DEFAULT '女',
        s_birthday DATE ,
        c_id INT REFERENCES  courses(id),#外鍵約束,不生效
        
        #表級約束
        #CONSTRAINT pk  PRIMARY KEY(id),
        #CONSTRAINT uq UNIQUE(s_name),
        CONSTRAINT fk_students_courses FOREIGN KEY(c_id) REFERENCES courses(id)
);
SHOW INDEX FROM students;
總結一下表級約束但語法:

【CONSTRAINT 約束名字】約束類型(字段名稱) 【額外但東西,如外鍵】

2.約束詳細:

2.1一般情況下MySQl的約束規范:

主鍵、非空、唯一性,默認等這些寫在列級
外鍵約束寫在表級

CREATE TABLE courses(
       id INT PRIMARY KEY,
             c_name VARCHAR(20) NOT NULL
);
2.2.主鍵和唯一性的區別:
2.2.1 主鍵(primary key)約束:同時保證唯一和非空

在同一個表中主鍵只能有一個在同一個表中可以將多個字段組合成一個主鍵(不推薦)
CONSTRAINT pk PRIMARY KEY(id,s_name),id和s_name組合起來成表的一個主鍵

2.2.2 唯一(unique)約束:

保證唯一但可以為空
在同一個表中唯一約束可有很多個
在同一個表中可以將多個字段組合成一個唯一但約束(不推薦)

2.3 外鍵的特點:
  • 要求從表上設置外鍵約束
  • 從表上的列和主表上的對應但關系列但數據類型必須一致,含義意義一致
  • 主表中的關聯列必須是一個key(一般是主鍵,很少時候也可以是唯一鍵)
  • 插入數據時,先插入主表,再插入從表,刪除的時候,先刪除從表記錄,再刪除主表記錄
DROP TABLE IF EXISTS students;
CREATE TABLE students(
    id INT PRIMARY KEY,#主鍵約束
        s_name VARCHAR(10) NOT NULL,#非空約束
        s_sex CHAR(1) NOT NULL DEFAULT '女',
        s_age  INT(3),
        s_birthday DATE ,
        s_seat INT(3) ,
        c_id INT REFERENCES  courses(id),#外鍵約束,不生效
        
        UNIQUE KEY s_seat (s_seat)
        #表級約束
        #CONSTRAINT pk  PRIMARY KEY(id),
        #CONSTRAINT uq UNIQUE(s_name),
        CONSTRAINT fk_students_courses FOREIGN KEY(c_id) REFERENCES courses(id)
);
SHOW INDEX FROM students;
總結:表級約束但語法

【CONSTRAINT 約束名字】約束類型(字段名稱) 【額外的東西,如外鍵】

CREATE TABLE courses(
       id INT PRIMARY KEY,
             c_name VARCHAR(20) NOT NULL
);

3.修改表時添加和刪除約束

1.非空約束

ALTER TABLE students MODIFY COLUMN s_name VARCHAR(20) NOT NULL; #添加
DESC students;
ALTER TABLE students MODIFY COLUMN s_name VARCHAR(20) ; #刪除
DESC students;

2.添加默認約束

ALTER TABLE students MODIFY COLUMN s_age int DEFAULT 18;
DESC students;
ALTER TABLE students MODIFY COLUMN s_age int;
DESC students;

3.添加主鍵

ALTER TABLE students MODIFY COLUMN id int PRIMARY KEY;
DESC students;
ALTER TABLE students MODIFY COLUMN id int ;#刪除不掉主鍵
ALTER TABLE students DROP PRIMARY key;#刪除主鍵
DESC students;

4.添加唯一鍵

ALTER TABLE students MODIFY COLUMN s_seat int UNIQUE;#添加
DESC students;
ALTER TABLE students DROP KEY s_seat;#刪除
DESC students;

5.外鍵

ALTER TABLE students ADD FOREIGN KEY(c_id) REFERENCES courses(id); #添加
DESC students;
SHOW INDEX FROM students;

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='students'; #查找鍵名主鍵外鍵名
ALTER TABLE students DROP FOREIGN KEY students_ibfk_1; #刪除 
DESC students;

4.標識列

有自增長列,可以不用插入值,MySQl自動提供默認的序列值。

創建表的時候添加自增長列:
DROP TABLE IF EXISTS t_identity;
CREATE TABLE t_identity(
   id int PRIMARY key AUTO_INCREMENT,
     `name` VARCHAR(20)
);
有了自增長列,我們添加數據記錄就可以:
INSERT INTO t_identity VALUES(null,'張三');
INSERT INTO t_identity VALUES(null,'李四');
INSERT INTO t_identity VALUES(null,'王二');
INSERT INTO t_identity VALUES(null,'王新');

INSERT INTO t_identity(name) VALUES(null,'王新');

修改表的時候添加自增長列:

ALTER TABLE t_identity MODIFY COLUMN id int AUTO_INCREMENT;

刪除自增長

ALTER TABLE t_identity MODIFY COLUMN id int ;
總結:
  • 自增長列必須和鍵(一般是主鍵)搭配
  • 一個表中有且只能有一個自增長列
  • 自增長列的類型只能數值型,一般情況用int
  • 自增長列可以設置步長( set AUTO_INCREMENT_INCREMENT=3;)也可以手動插入一個數值改變起始值。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • SQL語言基礎 本章,我們將會重點探討SQL語言基礎,學習用SQL進行數據庫的基本數據查詢操作。另外請注意本章的S...
    厲鉚兄閱讀 5,341評論 2 46
  • MYSQL 基礎知識 1 MySQL數據庫概要 2 簡單MySQL環境 3 數據的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 7,833評論 5 116
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發此異常。 O...
    我想起個好名字閱讀 5,395評論 0 9
  • 作者:燁竹 數據庫的基本操作 登陸MySQL數據庫服務:mysql -h服務器地址 -P端口號 -u用戶名 ...
    DragonRat閱讀 1,389評論 0 7
  • 回顧 字段類型(列類型):數值型,時間日期型和字符串類型 數值型:整型和小數型(浮點型和定點型) 時間日期型:da...
    翊溪閱讀 961評論 0 0