mysql 約束

/*
約束:
六大約束:
    not null:   非空物蝙,用于保證該字段的值不能為空俏拱,  比如姓名 學(xué)號等
    default:    默認想暗, 用于保證該字段有默認值  比如性別
    primary key:    主鍵吩坝,用于保證該字段的值具有唯一性,并且非空帮孔, 比如學(xué)號
    unique: 唯一, 用于保證該字段的值具有唯一性
    check:      檢查約束平绩,mysql不支持 , 比如年齡
    foreign key:    外鍵漠另,用于限制兩個表的關(guān)系捏雌,用于保證該字段的值必須來自于主表的關(guān)聯(lián)列的值, 比如 專業(yè)
                  在從表添加外鍵約束笆搓,用于引用主表中某列的值性湿,  比如專業(yè)編號 部門編號 員工工種編號

添加約束的時機:
    1. 創(chuàng)建表時
    2. 修改表時
    
約束的添加分類:
    列級約束:
        六大約束語法上都支持,但外鍵約束沒有效果
    表級約束:
        除了非空满败,默認肤频,其他都支持
        
主鍵和唯一的對比:
        保證唯一性   是否允許為空      一個表中可以有幾個   是否允許組合
    主鍵  √       ×           至多有一個       √ 但不推薦
    唯一  √       √(只允許一個為空)  可以有多個       √ 但不推薦
    
    insert into major values(1,'java');
    insert into major values(2,'h5');
    insert into stuinfo values(1,'john', '男', null, 19,1);
    insert into stuinfo values(2,'lily','男',null,19,2); 報錯
        
外鍵:
    1. 要求在從表設(shè)置外鍵關(guān)系
    2. 從表的外鍵列的類型和主表的關(guān)聯(lián)列的類型要求一致或兼容,名稱無要求
    3. 主表的關(guān)聯(lián)列必須是一個key(一般是主鍵或唯一)
    4. 插入數(shù)據(jù)時算墨,應(yīng)該先插入主表數(shù)據(jù)宵荒,再插入從表
       刪除時,順序相反
        
create table 表名(
    字段名 字段類型 列級約束
    字段名 字段類型
    表級約束
)
*/
create table Book(
  bid int primary key,
 bname varchar(20) unique not null,
price float default 10,
btypeId int,
foreign key(btypeid) reference bookType(id)
);

#添加列級約束
/*
 語法:
      直接在字段名和類型后面添加約束類型即可
      只支持:默認净嘀、非空报咳、主鍵、唯一
*/
CREATE DATABASE student;
USE student;
CREATE TABLE stuinfo(
    id INT PRIMARY KEY,#主鍵
    stuName VARCHAR(20) NOT NULL,
    gender CHAR(1) CHECK(gender='男' OR gender='女'), # gender in ('男'挖藏,’女‘)
    seat INT UNIQUE,
    age INT DEFAULT 18,
    magiorid INT REFERENCES major(id)   
);

CREATE TABLE major(
    id INT PRIMARY KEY,
    majorName VARCHAR(20)
);
SELECT * FROM major;
SELECT * FROM stuinfo;
DESC stuinfo;

# 查看stuinfo表中所有的索引暑刃,包括主鍵,外鍵膜眠,唯一
SHOW INDEX FROM stuinfo;

#添加表級約束
/*
 語法:
 在各個字段的最下面
 [constraint 約束名] 約束類型(字段名)
      
*/

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
    id INT,#主鍵
    stuName VARCHAR(20),
    gender CHAR(1), 
    seat INT ,
    age INT ,
    majorid INT,
    CONSTRAINT pk PRIMARY KEY(id),#主鍵
    CONSTRAINT uq UNIQUE(seat), #唯一
    CONSTRAINT ck CHECK(gender='男' OR gender='女'),
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);

SHOW INDEX FROM stuinfo;


CREATE TABLE stuinfo(
    id INT,#主鍵
    stuName VARCHAR(20),
    gender CHAR(1), 
    seat INT ,
    age INT ,
    majorid INT,
    PRIMARY KEY(id),#主鍵
    UNIQUE(seat), #唯一
    CHECK(gender='男' OR gender='女'),
    FOREIGN KEY(majorid) REFERENCES major(id)
);

# 通用的寫法

CREATE TABLE IF NOT EXISTS stuinfo(
    id INT PRIMARY KEY,
    stuName VARCHAR(20) NOT NULL,
    sex CHAR(1),
    seat INT UNIQUE,
    age INT DEFAULT 18,
    majorid INT,
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
# 修改表時添加約束
/*
1. 添加列級約束
alter table 表名 modify column 字段名 字段類型的約束;

2. 添加表級約束
alter table 表名 add [constraint 約束名] 約束類型(字段名)[外鍵的引用];

*/
CREATE TABLE stuinfo(
    id INT,#主鍵
    stuName VARCHAR(20),
    gender CHAR(1), 
    seat INT ,
    age INT ,
    majorid INT
);

# 添加非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;

ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;

# 添加默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

# 添加主鍵
#列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#添加唯一約束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;

ALTER TABLE stuinfo ADD UNIQUE(seat);

#添加外鍵
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
#修改表時刪除約束
#1. 刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

#2. 刪除默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT;

#3. 刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;

#4. 刪除唯一
ALTER TABLE stuinfo DROP INDEX seat;

SHOW INDEX FROM stuinfo;

#5. 刪除外鍵
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

        位置      支持的約束類型         是否可以起約束名
列級約束    列的后面    語法都支持岩臣,但外鍵沒有效果   不可以
表級約束    所有列的下面  默認和非空不支持,其他支持   可以(主鍵沒有效果)

# 標識列 自增長列
/*
 又稱為自增長列
 含義:
    可以不用手動的插入值宵膨,系統(tǒng)提供默認的序列值
 
 特點:
   1. 標識列必須和主鍵搭配嗎婿脸?不一定,但要求一定是key
   2. 一個表最多只能有一個標示列
   3. 標識列的類型只能是數(shù)值型 
   4. 標識列可以通過 set auto_increment_increment=3; 設(shè)置步長
      可以手動插入值設(shè)置起始值
     
*/
# 一柄驻,創(chuàng)建表時設(shè)置標識列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE IF NOT EXISTS tab_identity(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);

INSERT INTO tab_identity VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

SELECT * FROM tab_identity;

SHOW VARIABLES LIKE '%auto_increment%';

# 二。 修改表時設(shè)置標識列
ALTER TABLE tab_identiy MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

# 三焙压。修改表時刪除標識列
ALTER TABLE tab_identiy MODIFY COLUMN id INT;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸿脓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涯曲,更是在濱河造成了極大的恐慌野哭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幻件,死亡現(xiàn)場離奇詭異拨黔,居然都是意外死亡,警方通過查閱死者的電腦和手機绰沥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門篱蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贺待,“玉大人,你說我怎么就攤上這事零截◆锶” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵涧衙,是天一觀的道長哪工。 經(jīng)常有香客問我,道長弧哎,這世上最難降的妖魔是什么雁比? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮撤嫩,結(jié)果婚禮上偎捎,老公的妹妹穿的比我還像新娘。我一直安慰自己非洲,他們只是感情好鸭限,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著两踏,像睡著了一般败京。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梦染,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天赡麦,我揣著相機與錄音,去河邊找鬼帕识。 笑死泛粹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肮疗。 我是一名探鬼主播晶姊,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伪货!你這毒婦竟也來了们衙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤碱呼,失蹤者是張志新(化名)和其女友劉穎蒙挑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愚臀,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡忆蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋袜。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡男旗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桃焕,到底是詐尸還是另有隱情剑肯,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布观堂,位于F島的核電站让网,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏师痕。R本人自食惡果不足惜溃睹,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胰坟。 院中可真熱鬧因篇,春花似錦、人聲如沸笔横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吹缔。三九已至商佑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厢塘,已是汗流浹背茶没。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晚碾,地道東北人抓半。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像格嘁,于是被迫代替她去往敵國和親笛求。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 約束是一種限制糕簿,它通過對表的行或列的數(shù)據(jù)做出限制涣易,來確保表的數(shù)據(jù)的完整性、唯一性冶伞。 MySQL中約束保存在info...
    shadow雨軒閱讀 624評論 0 1
  • mysql約束 1. 約束簡介 關(guān)系型數(shù)據(jù)庫系統(tǒng)和文件系統(tǒng)的一個不同點是,關(guān)系型數(shù)據(jù)庫本身能保證存儲數(shù)據(jù)的完整性步氏,...
    王小冬閱讀 228評論 0 0
  • 約束能保證數(shù)據(jù)的完整性和一致性响禽。約束類型:主鍵約束、唯一約束、非空約束芋类、默認約束隆嗅、外鍵約束 主鍵約束(PRIMAR...
    原來是仙女阿閱讀 216評論 0 0
  • 接下來的一些內(nèi)容,我們需要提前學(xué)一些簡單的sql語句侯繁,方便大家理解接下來的知識胖喳。 DDL—數(shù)據(jù)定義語言(Creat...
    不排版閱讀 407評論 0 1
  • 1、NOT NULL 非空約束----字面意思 2贮竟、PRIMARY KEY 主鍵約束 3丽焊、UNIQUE KEY 唯...
    steamed_bun閱讀 243評論 0 0