Mysql02資料型別,五大約束
中文問題
Mysql資料庫需要知道客戶端使用什麼編碼,
來進行正確的編碼轉換
set names gbk;
告訴伺服器,自己是gbk編碼
Set names utf8;
告訴伺服器 自己是utf-8 編碼
資料型別
**數字** **unsigned標記** 新增 unsigned表示無符號,只有正數 zerofill標記 **int(4) zerofill** 顯示時,不足4位會補0 0001 0012 0123 超過4位按照實際走 1234567 **tinyint** 1位元組 **smallint** 2位元組 **int** 4位元組 int(3) 小括號數字,隻影響查詢顯示格式, 而不影響數字範圍 3 12 123 3345663 **bigint** 8位元組 **float** 4位元組 **double** 8位元組 **decimal/numeric** 定點浮點數,可以做精確運算 decimal(6,2) 整數4為,小數2位,總共6位 整數超出範圍,可能會報錯 小數超出範圍,會四捨五入 字串 **char(20)** 定長字串, 超出長度,可能會出錯,也可能會截斷 如果長度不足,會補空格 最長 255 效率更高 **varchar(20)** 變長字串 最大長度是255內,前面需要一個位元組來表示長度 最大長度超過255,前面需要兩個位元組來表示長度 最長65535位元組 一般用varchar儲存255內的字串 **text** 65535位元組 只佔用表總位元組量的10個位元組 **blob** 超大物件資料 要使用流來讀寫blob欄位資料 通常不用blob儲存文字 ## 日期時間 datetime 年月日時分秒 date 年月日 time 時分秒 timestamp 時間戳 年月日時分秒 最大隻到 2038年 修改一行資料時,第一個 timestamp 欄位會自動更新為系統當前時間 不能取null值,填入null值時,會自動填入系統當前時間 一般不用
約束
對一個欄位的取值進行限制
主鍵約束
唯一標識一行資料
例如:
id 學號 姓名 性別
1 1002345 xx xx
2 345342
3 4564745
4 743553242
5 36345
6 4356456
Id 身份證號 姓名 性別
1 4534534 xx xx
id 手機號 套餐 金額
使用者id+時間+隨機數字… 345345 Xx xxx
唯一,不重複
非空,不能取null
自動生成索引
一般不使用業務資料作為主鍵
而是使用無意義資料
新增主鍵
在新建表時新增
create table tb2(
id int primary key,
…
);
create table tb2(
id int,
…,
primary key(id)
);
create table tb2(
name…,
ip…,
…,
primary key(name, ip) – 雙主鍵(組合主鍵)
);
在修改表時新增
alter table tb2
add primary key(id);
檢視主鍵
desc tb2;
show create table tb2\G 刪除主鍵 alter table tb2 drop primary key; 自增主鍵
auto_increment
建表時新增自增主鍵:
id int primary key auto_increment
修改表將主鍵設定為自增(id已經是主鍵):
alter table tb2
modify id int auto_increment;
取消自增(不會刪除主鍵約束)
alter table tb2
modify id int;
自增主鍵填入 null 值時,自動填入自增值
檢視自增值的下一個值
show create table tb2\G
…
auto_increment: 54345
可以手動插入一個指定的值,如果這個值是表中的最大值,下一個自增值會自動從這個最大值增長
使用自增主鍵,不用管這個值是否連續
自增主鍵不能回退
查詢剛插入的資料生成的主鍵值
使用函式: last_insert_id()
select last_insert_id();
Insert … values(…),(…),(…) ;
Select last_insert_id(); 得到第一條資料的 id
last_insert_id() 只獲取當前資料庫連線所插入的 id 值
使用示例:
Insert into xuesheng(name)
values(‘aaa’);
insert into lianxi(xs_id, tel)
values(last_insert_id(),‘236236643’);
外來鍵約束
限制一個欄位的取值,只能取另一個主鍵的值
建立外來鍵
建表時建立外來鍵
create table tb3(
…
x_id …
…
foreign key(x_id) references tb2(id)
);
修改表時建立外來鍵(新增外來鍵)
alter table tb3
add foreign key(x_id) referneces tb2(id);
檢視外來鍵
show create table tb3;
刪除外來鍵
首先需要檢視外來鍵約束的名字
alter table tb2
drop foreign key 約束名
外來鍵也會自動建立索引,刪除外來鍵,不會自動刪除外來鍵的索引,如果想刪除外來鍵的索引:
alter table tb2
drop index 索引名
非空約束
新增非空約束
直接後面加not null
建立時新增
Create table tb2(
…
name varchar(20) not null,
…
);
修改時新增
Alter table tb2
Modify name varchar(20) not null;
檢視非空約束
Desc tb2;
Show create table tb2\G
取消非空約束
Alter table tb2
Modify name varchar(20);
Alter table tb2
Modify name varchar(20) null;
唯一約束
欄位取值不能重複,允許重複的 null 值
會生成索引
新增唯一約束
建表時新增
Create table tb2(
Username varchar(32) unique not null,
Email varchar(128) unique,
Addr varchar(255),
Tel varchar(20),
unique(addr, tel) – 欄位組合不重複
);
修改表時新增
Alter table tb2
Modify email varchar(128) unique;
Alter table tb2
Add unique(addr, tel);
檢視唯一約束
Desc tb2;
Show create table tb2;
– 檢視系統庫中的約束表
use information_schema; – 系統庫,庫資訊
select * from table_constraints
where table_name=‘xuesheng’;
取消唯一約束
alter table tb2
drop index 索引名;
檢查約束
通過設定欄位取值條件,來限制它的取值
比如性別,年齡範圍
Mysql支援檢查約束的語法,但沒有實現這個約束,mysql不會檢查約束條件
Create table xuesheng(
Gender…
Age…
Check(gender=’男’ or gender=’女’),
Check(age>8 and age<60)
);
預設值
age int default 0
comment註釋資訊
Create table tb2(
Id int comment ‘主鍵id’,
Name varchar(20) comment ‘姓名’
);
Show create table tb2\G 可以看到註釋
表之間的關係
一對一
具有唯一約束的外來鍵
既是主鍵也是外來鍵的欄位
一對多
在多方表新增外來鍵
多對多
需要一張中間表,新增兩個外來鍵欄位,分別引用兩張表的主鍵