MySQL 數據類型和約束(外鍵是重點🙄)
數據類型
1. 數字(默認都是由符號,寬度表示的是顯示寬度,與存儲無關).tinyint 括號裏指定寬度
七位2進制數最大數就是2**7 -1=127 最小是-128
驗證:
create tabel t1(id tinyint)
create tabe t2(id int)
浮點數
float
double
decimal
測試
create table t2(salary float)
float(6,2) 第一參數,代表寬度. 第二個參數代表小數點後面的位數.
2.字符串類型
char 與 varchar
char 類型:定長,浪費空間,存取速度快
不夠就用空格補,
字符長度範圍: 0 ~ 255 create table t6(name char(4)); insert into t6(‘aigen‘)#存不進去 insert into t6(‘能不能存‘) #能存進去 ####varchar:變長,精準,節省空間,存取速度慢 字符長度範圍:0 ~ 65535 **char 和 varchar 區別: char(5), 存不夠5個,用空格補齊. varhar(5), 你是幾個它就存幾個.** char_length : 查看的是字符的長度 ‘abc‘和‘你好啊‘ 都是三個字符. 但是前面是3個字節,後面 char(5)的length話,是11個字節. length : 查看字節. 一個英文字符算一個 bytes 一個中文字符算3個 bytes insert into t7 values(‘abc‘,‘abc ‘) select * from t6 where y= ‘abc ‘
3.日期類型
create table student(
id int,
name char(5),
born_date date,#‘2017-09-06‘,
born_year year, #‘2017‘,
res_time datetime, #‘2017-09-06 10:53:23‘
class_time time #‘10:53:23‘
);
insert into student values(1,‘ff‘,now(),now(),now(),now());
insert into student values(2,‘ff2‘,,now(),now(),now());
4.枚舉和集合
enum 枚舉: 規定一個範圍,可有多個值,但是為該字段傳值時,只能取規定範圍內的一個值.
set 集合: 規定一個範圍,但是為該字段傳值時,能取規定範圍中的一個值或多個值.
create table person( id int primary key auto_increment, name char(10), sex enum(‘male‘,‘female‘), hobbies set(‘music‘,‘read‘,‘swimming‘,‘learning English‘) ); insert into person (name,sex enum,hobbies set) values(‘ff‘,‘male‘,‘read,swimming‘);
約束
1.not null和 default...
create table student( id int primary key auto_increment, name char(5), sex enum(‘male‘,‘female‘) not null default ‘femela‘ );
insert into student (name) values(‘egon‘);
2.unique 唯一
主鍵就是不為空且唯一.
2.1單列唯一
create table teacher( id int not null unique, name char(10));
insert into teacher values(1,‘go‘);
insert table teacher values(1,‘alex‘);
2.2多列唯一
create table service( id int primary key autoincrement, name char(10), host char(15), port int, /#constraint hostport unique(host,port) );
2.3偏移量: autoincremenoffset
create table dep( id int primary key autoincrement, name char(10) )autoincrement=10;
insert into dep(name) values (‘it‘),(‘hr‘);
2.4步長 autoincrementincrement
create table dep( id int primary key auto_increment, name char(10) );
insert into dep(name) values (‘it‘),(‘hr‘);
set session autoincrementincrement=10;#會話級,只對當前回話有效.
set global autoincrementincrement=2;#全局,對所有的會話都有效.
autoincrementoffset#偏移量(也就是從幾開始) + autoincrementincrement#步長
set session autoincrementoffset=5; set session autoincrementincrement=2;
!!!如果偏移量的值大於步長的值,則偏移量的值會被忽略!
set session autoincrementoffset=2;
set session autoincrementincrement=3;
2.5show variables like ‘%auto_in%‘; #查看變量
primary key字段的值不為空且唯一... 一個表中可以,一般都加在 id 字段上. ```
3.foreign key(附練習) #外鍵
關聯
關聯 自己的字段 references(關聯) 要關聯的地方(字段) dep(id);
foreign key (dep_id) references dep(id)
如果想指定名字 constraint fk_depid_id
先建被關聯的表,先建被關聯的表,要保證被關聯的那個表示不為空且唯一的表. 關聯: 多的關聯那個1, 多本書關聯一個出版社,那麽被關聯的就是出版社.
create table dep(
id int,
name varchar(50),
comment varchar(100)
);
然後建需要關聯的表: create into emp_info(
id int primary key auto_increment,
name varchar(20),
dep_id int,
foreign key(dep_id) references dep(id)
on delete cascade
on update cascade
);
delete from dep where id=2;
update dep set id = 301 where id=3;
以上就是一條記錄對應另一個表的多條記錄.
先給被關聯的表插入初始化記錄
一個作者可以屬於多個出版社
一本書只能屬於一個出版社
書(兩本書的信息)
出版社(1設,2設)
多本書屬於一個出版社,那麽就是多對1, 1就是需要被關聯的那個表
書這張表 foreign key了出版社那張表的 id 字段.
出版社是需要被關聯的那個1.
create table press(
id int primary key auto_increment,
name varchar(20) not null
);
create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
insert into press(name) values(‘人出版社‘),(‘民出版社‘);
insert into book(name,press_id) values (‘pyjy‘,1),(‘ons‘,2),(‘go‘,2),(‘python‘,2),(‘java‘,3);
一個作者可以寫多本書,一本書可以有多個作者,他倆相互對應
create table author(
id int primary key auto_increment,
name varchar(20)
);
create table book2author(
id int not null unique auto_increment,
book_id int not null,
author_id int not null,
foreign key(book_id) references book(id)
on delete cascade
on update cascade,
foreign key(author_id) references author(id)
on delete cascade
on update cascade,
primary key (book_id,author_id)
);
insert into author(name) values(‘ff‘),(‘jm‘),(‘by‘);
insert into book2author(book_id,author_id) values(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1);
每個作者與自己的代表作如下
1 ff:
1 九陽神功
2 九陰真經
3 九陰白骨爪
4 獨孤九劍
5 降龍十巴掌
6 葵花寶典
2 jm:
1 九陽神功
6 葵花寶典
3 by:
4 獨孤6劍
5 降龍7巴掌
6 玫瑰花花寶典
MySQL 數據類型和約束(外鍵是重點🙄)