MySQL實(shí)戰(zhàn)10 約束

MySQL實(shí)戰(zhàn) 目錄

前言

約束:限制,限制我們表中的數(shù)據(jù),保證添加到數(shù)據(jù)表中的數(shù)據(jù)準(zhǔn)確和可靠性!凡事不符合約束的數(shù)據(jù),插入時(shí)就會(huì)失敗,插入不進(jìn)去的!
比如:學(xué)生信息表中,學(xué)號(hào)就會(huì)約束不可重復(fù)!

1.約束基本概念

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

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

1.2.添加約束的時(shí)期:

創(chuàng)建表的時(shí)候
修改表的時(shí)候

1.3.約束的添加分類:
1.3.1列級(jí)約束

6種約束可以寫,語法都支持,不報(bào)錯(cuò),但外鍵約束寫了等于白寫

1.3.2表級(jí)約束

not null 非空、default默認(rèn)不支持,其他都可以!

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),#外鍵約束,不生效
        
        #表級(jí)約束
        #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;
總結(jié)一下表級(jí)約束但語法:

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

2.約束詳細(xì):

2.1一般情況下MySQl的約束規(guī)范:

主鍵、非空、唯一性,默認(rèn)等這些寫在列級(jí)
外鍵約束寫在表級(jí)

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

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

2.2.2 唯一(unique)約束:

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

2.3 外鍵的特點(diǎn):
  • 要求從表上設(shè)置外鍵約束
  • 從表上的列和主表上的對(duì)應(yīng)但關(guān)系列但數(shù)據(jù)類型必須一致,含義意義一致
  • 主表中的關(guān)聯(lián)列必須是一個(gè)key(一般是主鍵,很少時(shí)候也可以是唯一鍵)
  • 插入數(shù)據(jù)時(shí),先插入主表,再插入從表,刪除的時(shí)候,先刪除從表記錄,再刪除主表記錄
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)
        #表級(jí)約束
        #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;
總結(jié):表級(jí)約束但語法

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

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

3.修改表時(shí)添加和刪除約束

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.添加默認(rèn)約束

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.標(biāo)識(shí)列

有自增長列,可以不用插入值,MySQl自動(dòng)提供默認(rèn)的序列值。

創(chuàng)建表的時(shí)候添加自增長列:
DROP TABLE IF EXISTS t_identity;
CREATE TABLE t_identity(
   id int PRIMARY key AUTO_INCREMENT,
     `name` VARCHAR(20)
);
有了自增長列,我們添加數(shù)據(jù)記錄就可以:
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,'王新');

修改表的時(shí)候添加自增長列:

ALTER TABLE t_identity MODIFY COLUMN id int AUTO_INCREMENT;

刪除自增長

ALTER TABLE t_identity MODIFY COLUMN id int ;
總結(jié):
  • 自增長列必須和鍵(一般是主鍵)搭配
  • 一個(gè)表中有且只能有一個(gè)自增長列
  • 自增長列的類型只能數(shù)值型,一般情況用int
  • 自增長列可以設(shè)置步長( set AUTO_INCREMENT_INCREMENT=3;)也可以手動(dòng)插入一個(gè)數(shù)值改變起始值。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • SQL語言基礎(chǔ) 本章,我們將會(huì)重點(diǎn)探討SQL語言基礎(chǔ),學(xué)習(xí)用SQL進(jìn)行數(shù)據(jù)庫的基本數(shù)據(jù)查詢操作。另外請(qǐng)注意本章的S...
    厲鉚兄閱讀 5,458評(píng)論 2 46
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 8,059評(píng)論 5 115
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,960評(píng)論 0 9
  • 作者:燁竹 數(shù)據(jù)庫的基本操作 登陸MySQL數(shù)據(jù)庫服務(wù):mysql -h服務(wù)器地址 -P端口號(hào) -u用戶名 ...
    DragonRat閱讀 1,443評(píng)論 0 7
  • 回顧 字段類型(列類型):數(shù)值型,時(shí)間日期型和字符串類型 數(shù)值型:整型和小數(shù)型(浮點(diǎn)型和定點(diǎn)型) 時(shí)間日期型:da...
    翊溪閱讀 1,065評(píng)論 0 0

友情鏈接更多精彩內(nèi)容