對使用者操作表的資料進行約束
作用:當使用者對使用預設值的字段不插入值的時候,就使用預設值。
注意:1)對預設值字段插入
null
是可以的
2)對預設值字段可以插入非
null
create table student(id int,
name varchar(
20),
address varchar(
20) default '預設值'
)
作用:限制字段必須賦值
注意:1)非空字元必須賦值
2)非空字元不能賦
null
--需求: gender欄位必須有值(不為null)create table student(
id int,
name varchar(
20),
gender varchar(
2) not null --非空
)
作用:對字段的值不能重複
注意:1)唯一字段可以插入
null
2)唯一字段可以插入多個
null
create table student(id int unique, --唯一
name varchar(20)
)insert into student(id,name) values(
1,'zs');
insert into student(id,name) values(
1,'lisi
'); -- error 1062 (23000): duplicate entry '1'
for key 'id'
insert into student(id,name) values(
2,'lisi
');
作用:非空+唯一
注意:1)通常情況下,每張表都會設定乙個主鍵字段。用於標記表中的每條記錄的唯一性。
2)建議不要選擇表的包含業務含義的字段作為主鍵,建議給每張表獨立設計乙個非業務含義的
id欄位。
create table student(id int primary key, --主鍵
name varchar(20)
)insert into student(id,name) values(
1,'張三');
insert into student(id,name) values(
2,'張三');
-- insert into student(id,name) values(1,'
李四'); -- 違反唯一約束: duplicate entry '1'
for key '
primary
'-- insert into student(name) value('
李四'); -- 違反非空約束: error 1048 (23000): column '
id' cannot be null
作用:自
動遞增
create table student(id int(
4) zerofill primary key auto_increment, --自增長,從0開始 zerofill 零填充
name varchar(20)
)--自增長字段可以不賦值,自動遞增
insert into student(name) values('張三
');insert into student(name) values('李四
');insert into student(name) values('王五
');select *from student;
--不能影響自增長約束
delete from student;
--可以影響自增長約束
truncate table student;
作用:約束兩種表的資料
出現兩種表的情況:
解決資料冗餘高問題:
獨立出一張表
例如:員工表
和部門表
問題出現:在插入員工表資料的時候,員工表的部門id欄位可以隨便插入
使用外來鍵約束:約束插入員工表的部門id字段值
解決辦法:
在員工表的部門id欄位新增乙個外來鍵約束
--部門表(主表)create table dept(
id int primary key,
deptname varchar(20)
)-- 修改員工表(副表/從表)
create table employee(
id int primary key,
empname varchar(
20),
deptid int,--把部門名稱改為部門id
--宣告乙個外來鍵約束
constraint emlyee_dept_fk foreign key(deptid) references dept(id)
--外來鍵名稱 外來鍵 參考表(參考字段)
)
注意:1)被約束的表稱為副表,約束別人的表稱為主表,外來鍵設定在副表上的!!!
2)主表的參考字段通用為主鍵!
3)新增資料: 先新增主表,再新增副表
4)修改資料: 先修改副表,再修改主表
5)刪除資料: 先刪除副表,再刪除主表
-- 1.6外來鍵約束
--員工表
create table employee(
id int primary key,
empname varchar(
20),
deptname varchar(
20) --部門名稱
)insert into employee values(
1,'張三
','軟體開發部');
insert into employee values(
2,'李四
','軟體開發部');
insert into employee values(
3,'王五
','應用維護部');
select *from employee;
--新增員工,部門名稱的資料冗餘高
insert into employee values(
4,'陳六
','軟體開發部');
--解決資料冗餘高的問題:給冗餘的字段放到一張獨立表中
--獨立設計一張部門表
create table dept(
id int primary key,
deptname varchar(20)
)drop table employee;
--修改員工表
create table employee(
id int primary key,
empname varchar(
20),
deptid int,--把部門名稱改為部門id
--宣告乙個外來鍵約束
constraint emlyee_dept_fk foreign key(deptid) references dept(id)
--外來鍵名稱 外來鍵 參考表(參考字段)
)insert into dept(id,deptname) values(
1,'軟體開發部');
insert into dept(id,deptname) values(
2,'應用維護部');
insert into dept(id,deptname) values(
3,'秘書部');
insert into employee values(
1,'張三
',1);
insert into employee values(
2,'李四
',1);
insert into employee values(
3,'王五
',2);
insert into employee values(
4,'陳六
',3);
--問題: 該記錄業務上不合法,員工插入了乙個不存在的部門資料
insert into employee values(
5,'陳六
',4); --違反外來鍵約束: cannot add or update a child row: a foreign key constraint fails (`day16`.`employee`, constraint `emlyee_dept_fk` foreign key (`deptid`) references `dept` (`id`))
-- 1)當有了外來鍵約束,新增資料的順序: 先新增主表,再新增副表資料
-- 2)當有了外來鍵約束,修改資料的順序: 先修改副表,再修改主表資料
-- 3)當有了外來鍵約束,刪除資料的順序: 先刪除副表,再刪除主表資料
--修改部門(不能直接修改主表)
update dept set id=4 where id=3
;--先修改員工表
update employee set deptid=2 where id=4;
--刪除部門
delete from dept where id=2
;--先刪除員工表
delete from employee where deptid=2
;select *from dept;
select * from employee;
Mysql資料庫 約束型別
mysql資料庫的約束型別有 主鍵約束 primary key 外來鍵約束 foreign key 非空約束 not null 唯一性約束 unique 預設約束 default 一.主鍵約束 primary key 主鍵約束要求主鍵列的資料唯一,並且不能為空。主鍵分為兩種型別 單字段主鍵和多字段聯...
mysql資料庫之約束
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保標的資料完整性 唯一性。1 非空約束 not null 欄位的值不能為空 1.1 建立表時新增非空約束 1.2 修改表時新增非空約束 1.3 刪除非空約束 2 唯一約束 unique 要求該列唯一,允許為空,唯一約束可以確保一列或者幾列不出現重...
MySQL資料庫 列約束
mysql可以對插入的資料進行特定的驗證,只有符合格式才允許插入,否則認為非法的插入,列如乙個人的性別只能是男或女 1 主鍵約束 primary key 首要的 主要的 鍵 不重複,乙個資料表只能有乙個,可以加快資料的查詢速度。不確定的可以用null,主鍵約束不允許為null 2 非空約束 not ...