Mysql-資料型別及表約束
表的資料型別
tinyint
有符號:-128~127, 無符號:0~255, 預設有符號
create table t1(num tinyint);
insert into t1 values(1);
insert into t1 values(128); --越界報錯
無符號:
create table t2(num tinyint unsigned);
insert into t2 values(-1); --報錯
insert into t2 values(255);
float
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數位數,佔用空間4個位元組
float(4, 2)表示的範圍有符號數是-99.99~99.99,無符號數是0~99.99mysql在儲存數值時會自動進行四捨五入
create table t3(id int, salary float(4, 2));
insert into t3 values(1, -99.99);
insert into t3 values(2, -99.991); --四舍
insert into t3 values(3, 99.986); --五入
decimal
decimal(m, d) [unsigned] : 定點數m指定長度,d表示小數點的位數
decimal(5, 2)表示的範圍是-999.99~999.99,這樣來看decimal和float很像,但是兩者表示的精度不一樣
create table t4(id int, num1 float(10, 8), num2 decimal(10, 8));
insert into t4 values(1, 21.21335432, 21.21335432);
select * from t4;
這樣看來,還是decima的精度更高一些,所以希望小數的精度更高,推薦使用decimal
char和varchar
char(L): 固定長度字串,L是可以儲存的長度,單位為字元,最大長度值可以為255
varchar(L): 可變長度字串,L表示字元長度,最大長度65535個位元組
varchar長度可以指定為0到65535之間的值,但是有1 - 3 個位元組用於記錄資料大小,所以說有效位元組數是 65532。
當我們的表的編碼是utf8時,varchar(n)的引數n最大值是65532/3=21844(因為utf中,一個字元佔用3個位元組),如果編碼是gbk,varchar(n)的引數n最大是65532/2=32766(因為gbk中,一個字元佔用2位元組).
所以資料長度如果都一樣,就使用定長(char),資料長度有變化,就使用變長(varchar).
日期和時間
datetime 時間日期格式 'yyyy-mm-dd HH:ii:ss' 表示範圍從1000到9999,佔用八位元組
date:日期 'yyyy-mm-dd',佔用三位元組
timestamp:時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,佔用四位元組
enum和set
enum,可以理解為單選型別,設定提供了多個選項的值,最終一個單元內只儲存了一個值
set,可以理解為多選型別,設定提供了多個選項值,最終一個單元格內可以儲存多個值
建立一個調查表votes,需要調查人的喜好, 比如(登山,游泳,籃球,武術)中去選擇(可以多選),(男,女)[單 選]:
create table votes(
name varchar(30),
hobby set('登山', '游泳', '籃球', '武術'),
gender enum('男', '女')
);
插入資料:
insert into votes values('李四', '登山', '女');
insert into votes values('張三', '游泳,武術', '男');
表的約束
空屬性
雖然資料型別能夠約束欄位,但是資料型別比較單一,需要一些其他的約束,比如在學生表中,E-mail可以為空,但是姓名學號不能為空。我們可以建立一個班級表,表中必須要有班級和教室的名字,如果沒有這兩個就不知道在哪上課:
create table myclass(
class_name varchar(20) not null,
class_room varchar(20) not null
);
查看錶結構,不允許為空:
預設值
使用關鍵字default,某一個屬性經常性的出現某一個具體的值,可以在一開始指定好,在使用時,使用者可以選擇性的使用預設值
create table t6(
name varchar(20) not null,
age tinyint unsigned default 0,
sex char(2) default '男'
);
插入資料,不指定欄位值,使用預設值
insert into t6 (name) values ('張三');
select * from t6;
列描述
列描述在建立表時沒有實際意義,用來描述該欄位,跟據表建立語句儲存
create table t7 (
name varchar(20) not null comment '姓名',
age tinyint unsigned default 0 comment '年齡',
sex char(2) default '男' comment '性別'
);
一般用desc語句檢視不到註釋資訊,使用下面語句檢視,\G是以列顯示:
show create table t7\G;
zerofill
格式化輸出,如果寬度小於設定的寬度(這裡設定的是 ),自動填充0。要注意的是,這只是最後顯示的結果。
主鍵
主鍵:primary key用來唯一的約束該欄位裡面的資料,不能重複,不能為空,一張表中最多隻能有一個主鍵;主鍵所在的列通常是整數型別。
建立表的時候直接在指定欄位上新增:
create table t8(
id int unsigned primary key comment '學號不為空',
name varchar(20) not null
);
在建立表的時候,在所有欄位之後,使用primary key(主鍵欄位列表)來建立主鍵,如果有多個欄位作為主 鍵,可以使用複合主鍵。
create table t9(
id int unsigned,
course char(10) comment '課程代號',
score tinyint unsigned default 60 comment '成績',
primary key(id, course) --組合主鍵
);
建立表之後追加主鍵
alter table 表名 add primary key(欄位列表)
刪除主鍵
alter table 表名 drop primary key
自增長
auto_increment:當對應的欄位,不給值,會自動的被系統觸發,系統會從當前欄位中已經有的最大值+1操作, 得到一個新的不同的值。
通常和主鍵搭配使用,作為邏輯主鍵。
自增長的特點: 任何一個欄位要做自增長,前提是本身是一個索引(key一欄有值)
自增長欄位必須是整數
一張表最多隻能有一個自增長
create table t10(
id int unsigned primary key auto_increment,
name varchar(20) not null
);
插入資料,可以不指定id
insert into t10 (name) values ('張三');
insert into t10 (name) values ('李四');
select * from t10;
唯一鍵
unique 一張表中有往往有很多欄位需要唯一性,資料不能重複,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有 多個欄位需要唯一性約束的問題。
唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空欄位不做唯一性比較。
create table t11(
id char(10) unique comment '不能重複,可以為空',
name varchar(20)
);
外來鍵
外來鍵用於定義主表和從表之間的關係:外來鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當 定義外來鍵後,要求外來鍵列資料必須在主表的主鍵列存在或為null。
foreign key (欄位名) references 主表(列)
建立主鍵表
create table class(
id int primary key,
name varchar(20) not null comment '班級名'
);
建立從表
create table stu(
id int primary key,
name varchar(20) not null comment '學生名',
class_id int,
foreign key (class_id) references class(id)
);
綜合案例
有一個商店的資料,記錄客戶及購物情況,有以下三個表組成:
1、商品goods(商品編號goods_ id,商品名goods_ name, 單價unitprice, 商品類別category, 供應商provider)
2、客戶customer(客戶號customer_ id,姓名name,住址address,郵箱email,性別sex,身份證card_id)
3、購買purchase(購買訂單號order_ id,客戶號customer_ id,商品號goods_ id,購買數量nums)
要求:
每個表的主外來鍵
客戶的姓名不能為空值
郵箱不能重複
客戶的性別(男,女)
--建立goods表
create table goods(
goods_id int unsigned primary key auto_increment,
goods_name varchar(100) not null default '',
unitprice decimal(10, 2) not null default 0.0,
category smallint not null default 0,
provider varchar(100) not null default ''
);
--建立customer
create table customer(
customer_id int unsigned primary key auto_increment,
name varchar(50) not null default '',
address varchar(100) not null default '',
email varchar(60) not null unique,
sex enum('男','女') not null default '男',
card_id varchar(20) not null unique
);
--建立purchase
create table purchase (
order_id varchar(30) not null primary key,
customer_id int unsigned,
goods_id int unsigned,
nums int not null default 0,
foreign key(customer_id) references customer(customer_id),
foreign key(goods_id) references goods(goods_id)
);