/*
約束:
六大約束:
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;