查看約束
select * from information_schema.table_constraints
where table_name='要查看的表名'
按約束的作用范圍
列級約束: 將此約束聲明在對應字段的后面
表級約束:在表中所有字段都聲明完,在所有字段的后面聲明的約束,可以聲明組合約束
約束的作用
- not null 非空約束
- unique 唯一約束
- primary key 主鍵約束
- foreign key 外鍵約束
- check 檢查約束
- default 默認值約束
添加約束
聲明表定義約束
create table 表名 (
id int not null
);
聲明表之后,追加、刪除約束
alter table 表名
modify 列 類型 約束 — 追加約束 寫上約束便可,若刪除約束 不寫約束便可
sql server 追加約束
alter table 表名
add constraint 約束名 約束類型 (字段)alter table 表名
add constraint ch_tel check( 列名 like [0-9] [0-9][0-9][0-9] )
非空約束
聲明表定義約束
create table 表名 (
id int not null
);
聲明之后追加約束
alter table 表名
modify 列 類型 not null— 追加約束 寫上約束便可,若刪除約束 不寫約束便可
刪除非空約束
alter table 表名
modify 列 類型 — 除去 not null 便可
唯一約束 UNIQUE
- 同一個表可以有多個唯一約束
- 唯一約束可以是某一列的值唯一,也可以多個列組合的值唯一(復合約束)
- 唯一約束允許列值為空, 主鍵約束 是特殊的唯一約束,只是不允許為 null,即 主鍵約束(primary key)相當于 唯一約束+非空約束組合,主鍵約束 列 不允許重復,且不能出現 空值 null
- 在創建唯一約束的時候,若沒有給唯一約束 命名,則默認和列名相同。復合唯一約束,沒命名,也取 復合列中的第一個列 做為約束名
- Mysql 會給唯一約束的列上默認創建一個唯一索引, SQL server 中 主鍵約束,會默認創建一個 唯一索引
在create table 添加唯一約束
create table 表名(
sut_NO char(8) UNIQUE, – 列級約束
sut_ID char(18), – , 別忘記
constraint 約束名 UNIQUE(sut_ID ) 可以簡寫 UNIQUE KEY (sut_ID) —表級約束
);
在create table 添加復合唯一約束
create table 表名(
sut_NO char(8) , – 列級約束
sut_ID char(18), – , 別忘記
constraint 約束名 UNIQUE(sut_ID ,sut_NO) 可以簡寫 UNIQUE KEY (sut_ID,sut_NO) —表級約束
);
建表后 指定唯一約束
方式1 支持復合約束的
alter table 表名 add unique key(字段列表)方式2 不支持復合約束
alter table 表名 modify 字段名 unique
刪除唯一約束
alter table 表名
DROP INDEX 索引名查看表的索引
show index from 表名 ;
主鍵約束 PRIMARY KEY
主鍵約束: 唯一約束+ 非空約束 非空且唯一
create table 主鍵約束
create table student (
id int autoincrement,
name varchar(10),
stu_ID char(18) primary key -- 列級約束----身份證號 create table student (
id int ,
name varchar(10),
stu_ID char(18) ,
-- MYSQL 主鍵名總是PRIMARY ,就算命名了主鍵約束名,也沒用
constraint 約束名 primary key(stu_ID) -- 列級約束----身份證號
建表后 指定唯一約束
alter table 表名
add primary key (字段、字段);
刪除主鍵約束
alter table 表名
drop primary key;
自增列 AUTO_INCREMENT
自增列的特點
- 一個表最多只能有一個自增長列,SQLServer 也是這樣, 同一個表,后面列設置Identity,前面設置的就自動取消了。
- 當需要產生唯一標識符或順序值時,可設置自增長
- 自增長列約束的列必須是鍵列(主鍵列,唯一鍵列),否則會出現上面的錯誤。
- 自增約束的列的數據類型必須是整數類型
- 如果自增列指定了0和null,會在當前最大值的基數上自增;如果自增列手動指定具體值,直接賦值為具體的值 .[ insert ]
create table 自增列
create table student (
id int primary key auto_increment,
name varchar(10))
建表后 指定自增列
alter table 表名
modify 列名 數據類型 auto_increment;
刪除自增列
alter table 表名
modify 列名 數據類型 ;
sql server identity **
要想顯示的為某表的標識列顯示添加數據,在insert語句中一定要在表后面顯示**要添加的字段,即使是所有字段,也不能省略。
如:Table_1(ID,score,name),如果只寫Table_1仍然不能為ID顯示的添加數據。
注意2:插入完數據要將identity_insert設置為OFF。
若不關閉,則再次添加數據時,無法自增長,提示錯誤信息:
set identity_insert 表名 ON
insert into 表名(列,。。。列)
values(值,。。。。值)
set identity_insert 表名 OFF
自增列 mysql 5.7 與 mysql 8.0 系列 區別
MySQL 5.7 自增主鍵 Auto_increment 的值如果大于 表中的 最大值+1,在mysql重啟之后,會重置Auto_increment值 modify 列名 數據類型 現有表中 最大值+1 (就刪除數據,導致內存中表的auto_increment > 表中最大的自增列的值+1,重啟mysql,內存中auto_increment 就會消失,會根據 獲取 現有表中 自增列的 最大值+1,放在內存作為此表的 auto_increment 值 ), 這種現象在某些情況下,會導致業務主鍵沖突或者其他難以發現的問他
MySQL 8.0 系列 將自增主鍵的計數器持久化到 重做日志 中。每次計算器發生改變,都會將其寫入重做日志中。如果數據庫重啟,InnoDB會根據重做日志中的信息來初始化計數器的內存值。
create table 表名(
id int auto_increment primary key,
name char(10)
) engine innodb auto_increment=100 default charset 'utf8'
或者 首條記錄指明 自增列的值,后續就 +1了
insert into 表名
values(300,‘zen’);
insert into 表名 (name)
values(‘zen’); //id jius 301
alter table 表名
modify 字段 類型 Auto_increment;
alter table 表名
modify 字段 類型 primary key Auto_increment;
外鍵約束 Foreign key
**sql server **
主表:有外鍵 對應的表,就是主表,或稱 父表
從表:有外鍵的表,就算從表,或稱 子表
城市表(主表), 學生表(從表), 學生表中的戶籍地址外鍵,對應城市表的主鍵。
注意外鍵對應的在主表中,必須是主鍵或者唯一鍵
Mysql
外鍵的 特性:
- 從表的外鍵列,必須引用或參考主表的鍵(主鍵或唯一約束的列),因為被依賴或被參數的值必須是唯一的。
- 在創建外鍵約束時,如果不給外鍵約束命名**,默認名不是列名,而是自動產生一個外鍵名**,也可以指定外鍵約束名
- 創建(create)表時就指定外鍵約束的話,先創建主表,再創建從表 從表依賴主表
- 刪表時,先刪從表(或先刪除外鍵約束),再刪除主表( 從表依賴主表。)
- 當主表的記錄被從表參照時,主表的記錄將不允許刪除。如果要刪除數據,需要先刪除從表中依賴該記錄的數據,然后才可以刪除主表的數據
- 在從表中指定外鍵約束,并且一個表可以建立多個外鍵約束
- 從表的外鍵列與主表被參照的列名子可以不相同,但是數據類型必須一樣,邏輯意義要一致。如果類型不一樣,創建子表時,就會出現錯誤。
- 當創建外鍵約束時,系統默認會在所在的列上建立對應的普通索引。但是索引名是列名,不是外鍵的約束名(根據外鍵查詢效率很高,因為外鍵,系統會創建普通索引)
- 刪除外鍵約束后,必須手動刪除對應的索引
create table 創建外鍵
主表
create table department(
dept_id char(10) primary key,
dept_name varchar(15));從表
create table employee(
emp_no char(6) primary key ,
department_id chart(10),
【constraint FK_emp_dept】 foreign key (department_id) references department(dept_id));
alter table 創建外鍵
主表
create table department(
dept_id char(10) primary key,
dept_name varchar(15));從表
create table employee(
emp_no char(6) primary key ,
department_id chart(10)
);alter table employee
add 【constraint FK_emp_dept】 foreign key (department_id) references department(dept_id);
刪除外鍵
1.首先要查看約束
select * from information_schema.table_constraints
where table_name = ‘表名’;
刪除外鍵約束
alter table 表名
drop foreign key 外鍵約束名; – drop primary key 刪除主鍵約束查看表的索引
show index from 表名;刪除索引
alter table 表名
drop index 索引名;
約束等級
- Cascade 方式: 在父表上 updae | delete 數據時,同步 Update | Delete 子表的匹配記錄
- Set null 方式: 在父表上update/delete記錄時,將子表上匹配記錄的列設為null要注意子表的外鍵列不能為not null
- No action 方式:如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作
- Restrict 方式:同no action, 都是立即檢查外鍵約束
主表
create table department(
dept_id char(10) primary key,
dept_name varchar(15));從表
create table employee(
emp_no char(6) primary key ,
department_id chart(10),
【constraint FK_emp_dept】 foreign key (department_id) references department(dept_id) on update cascade on
);
外鍵創建的規定
在 mySQL 里,外鍵約束是有成本的,需要消耗系統資源。對于大并發的SQL操作,有可能會不適合。比如大型網址中的中央數據庫,可能會因為外鍵約束的系統開銷而變得非常慢。所以,MYSQL 允許你不使用系統自帶的外鍵約束,在 應用層面完成檢查數據一致性的邏輯。也就是說,即使你不用外鍵約束,也要想辦法通過應用層面的附加邏輯,來實現外鍵約束的功能,保持數據的一致性、
【阿里開發規范】
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決
說明: 學生表中的Student_id 是主鍵,那么成績表中的student_id 則為外鍵。如果更新學生表中的 student_id ,同時觸發成績表中的student_id 更新,即為級聯更新。外鍵與級聯更新適用于 單機低并發,不適合分布式、高并發集群;級聯更新是強阻塞,存在數據庫 【更新風暴】的風險;外鍵影響數據庫的插入速度。
外鍵約束(foreign key)不能跨引擎使用
mySQL 支持多種存儲引擎,每一個表都可以指定一個不同的存儲引擎,需要注意的是:外鍵約束是用來保證數據的參考完整性的,如果表之間需要關聯外鍵,卻指定了不同的存儲引擎,那么這些表之間是不能創建外鍵約束的。所以說,存儲引擎的選擇也不完全的隨意的
check 約束
sql server
刪除約束
alter table zen_4
drop constraint CK__zen_4__gender__6DB73E6A
作用 | 功能
檢查某個字段的值是否符合xxx 要求,一般指的是值的 范圍
**mysql 5.7 不支持 check mysql 8.0 支持 **
create table
create table 表名(
id int,
gender char(1) check (gender =’男‘ or gender =’女‘)
alter table
alter table 表名
modify id int check(id <100);
Default 約束
create table
create table 表名(
id int,
name char(10),
salary decimal(8,2) default 2080 );
alter table
alter table 表名
modify salary decimal(8,2) default 2200;
刪除 Defualt 約束
alter table 表名
modify salary decimal(8,2);