1. 程式人生 > >Python-資料型別 主鍵auto_increment

Python-資料型別 主鍵auto_increment

1.詳細的建表語句 *****
create table 表名(
欄位名1 資料型別[(長度) 約束條件],
欄位名2 資料型別[(長度) 約束條件]
);

解釋:
型別:使用限制欄位必須以什麼樣的資料型別傳值
約束條件:約束條件是在型別之外新增一種額外的限制
為什麼需要給資料分類?(189 一八九)
1.描述資料更加準確
2.節省記憶體空間
注意:
1. 在同一張表中,欄位名是不能相同
2. 寬度和約束條件可選,欄位名和型別是必須的
3、最後一個欄位後不加逗號
create database db37;

insert 語句
insert into 表名 values(值1,值n,....)
要求值得順序 個數 必須與表字段完全對應
另一種寫法
insert into 表名(欄位名1,欄位名n,....) values(值1,值n,....)
可以選擇性得插入某些欄位 要求值得順序 必須與表名後面宣告得欄位一致

2.資料型別 *****
整數型別
1、作用:id號,各種號碼,年齡,等級
2、分類:
tinyint(**)1位元組 (-128,127)
int (*****) 4位元組
bigint(***)8位元組
smallint 2位元組
mediumint 3位元組
3、測試:
預設有符號的
設定為無符號unsigned
1.create table t2(age tinyint unsigned);
2.建表後用alter修改

create table t2(x tinyint unsigned);
insert into t2 values(-1),(256);

create table t4(x int(12) unsigned);
insert into t4 values(4294967296123);

4、強調:對於整型來說,資料型別後的寬度並不是儲存限制,而是顯示限制
所以在建立表示,如果欄位採用的是整型型別,完全無需指定顯示寬度,
預設的顯示寬度,足夠顯示完整當初存放的資料

# 顯示時,不夠8位用0填充,如果超出8位則正常顯示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);
insert into t5 values(1);

總結:除了儲存範圍沒啥區別
都是整型
預設有符號
對於顯示寬度 原理是相同的

長度引數如果不指定 會有預設值(3)

嚴格模式
什麼是嚴格模式
對插入的資料嚴格要求 不再範圍內直接報錯
例如往tinyint中插入大於255的值將報錯
什麼是非嚴格模式
不對插入的資料嚴格要求 不再範圍內也可以儲存
儲存的當前型別最大支援的值

5.6預設是非嚴格模式
5.7以後預設嚴格模式

檢視SQL模式
select @@sql_mode;
show variables like "sql_mode";
show variables like "%sql_mode%";

修改SQL模式
set @@sql_mode = "值";
正常情況不需要改
+----------------------------+---------------------+
| Variable_name | Value |
+----------------------------+---------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES |
+----------------------------+---------------------+
8 rows in set (0.00 sec)

#修改sql_mode為嚴格模式:在該模式下,如果插入的資料超過限制,則會立即報錯
mysql> set global sql_mode="strict_trans_tables";

浮點型別
作用:儲存身高、體重、薪資
分類:
float (*****)4位元組 滿足大部分使用場景
double (**)8位元組
decimal (**)不固定 適合銀行系統 科學研究等
create table t9(num float(m,d))
m 表示總長度 d 表示小數部分的長度
長度表示不是資料儲存範圍 而是字元長度
10.12 總長為4 小數部分為2

各個型別的最大長度
float (255,30) ***** 括號內不填,預設沒有小數,整數非零的數字顯示6位
double (255,30)
decimal (65,30)

區別:
float與double的精度不同 都是不準確的小數
decimal 準確的小數 不會丟失精度

括號中m和d的值 可以限制資料儲存範圍 與整型不同
重點:記住m和d的含義
測試:
#相同點
1、對於三者來說,都能存放30位小數,
#不同點:
1、精度的排序從低到高:float,double,decimal
2、float與double型別能存放的整數位比decimal更多


create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));

insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);


mysql> select * from t9;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t10;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t11;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)

字串型別
1、作用:姓名,地址,描述類的資訊

2、分類:
char 定長字串 使用頻率更高
varchar 可變長度字串
注意字串中 長度指定的是資料的字元長度 與位元組沒關係

create table t13(c1 char,c2 varchar(10));
在建立時 varchar必須指定長度 char有預設值 (1)

不同點:
a char(3) b char(3)
A |B |
char型別在取資料時 就根據長度來獲取 不關心真實資料長度
無論的資料有多長 佔用的空間是固定的 造成了一定空間浪費
name char(5)
# 缺點:浪費空間
# 優點:存取速度都快
egon alex lxx wxx yx

a varchar(30) b varchar(30)
(1)A(1)B
varchar型別在取資料時 先獲取資料長度 在根據長度獲取真實資料 關心真實資料長度
先儲存長度需要一個位元組 再儲存真實資料 不會浪費空間
但是 由於需要計算資料的長度 所以存取速度會比定長慢
name varchar(5)
# 缺點:存取速度都慢
# 優點:節省空間
(1bytes+egon)(1bytes+alex)(1bytes+lxx)

相同點:
括號中的數字 都是表示儲存最大字元長度

mysql會在儲存資料時自動將資料末尾的空格去掉
如果必須要存空格 需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH 意思是把空格當作有效資料

# 注意:
由於自動去除空格這個機制 在使用等於符號 和like時有區別
select *from t1 where name = "yh "; name欄位明確地等於一個值,該值後填充空格是沒有用,會自動去除空格
select *from t1 where name like "yh "; name欄位模糊匹配一個值,該值後填充空格是有用的,不會自動去除空格
like 用於模糊匹配 使用%表示0或任意個任意字元 使用_表示一個任意字元

3、測試:字元的寬度限制單位是字元個數
create table t12(x char(4)); # 超出4個字元則報錯,不夠4個字元則用空格補全成4個字元
create table t13(y varchar(4));# 超出4個字元則報錯,不夠4個字元那麼字元有幾個就存幾個

insert into t12 values('hello');
insert into t13 values('hello');

insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a'

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
select char_length(x) from t12; #4
select char_length(y) from t13; #1

日期和時間
1、作用:時間相關
2、分類:
date:1999-01-27
time: 11:11:11
datetime*****:1999-01-27 11:11:11
year:1999
timestamp *****
timestamp特點是:可以給null 自動輸入當前時間 當這條記錄被修改了會自動更新當前時間
3、測試
create table student(
id int,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
);

insert into student values(1,'egon','2000','2000-01-27','08:30:00','2013-11-11 11:11:11');

列舉
列舉enum,多選一個
enum 可以指定一堆字串的值 在插入資料時 資料必須這堆字串中的其中一個 ("男的","女的") 多選一
集合
集合set,多選多
set 可以指定一堆字串的值 在插入資料時 資料必須這堆字串中的其中一個或多個 ("男的","女的") 多選多
列舉和集合共同點:資料都是字串型別
測試
create table teacher(
id int,
name char(16),
sex enum('male','female','others'),
hobbies set('play','read','music','piao')
);

3.約束****
是一種對資料限制
已經學習過的 資料型別 unsigned無符號 字串長度 浮點的長度

約束的作用是?
為了保證資料的正確性,完整性
例如要儲存密碼 char(20) 只限制了型別和長度, 無法保證資料的正確性

額外的約束
語法:
建立時指定約束
create table 表名稱(欄位名 型別(長度) 約束名稱1 約束名稱n,....)
後期修改的方式新增 約束
alter table 表名稱 modify 欄位名 型別(長度) 約束名稱1 約束名稱n,....

NOT NULL 非空約束 限制該欄位的值不能為空
UNIQUE 唯一性約束 限制該欄位的值是唯一的不能出現重複
DEFAULT 預設值約束 如果插入資料時沒有指定該欄位的值則使用預設值
PRIMARY KEY 主鍵約束 限制該欄位 不能為空 並且是唯一的 可以唯一標識一條資料 *****
FOREIGN KEY 外來鍵約束 用來指向另一個表的主鍵

#not null + default測試
create table t15(
id int,
name char(16) not null,
sex enum('male','female','other') not null default "male"
);

alter table t15 modify name char(16) not null;

insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3');

每一個表都應該有一個主鍵 需要唯一標識 否則可以可能出現完全相同的兩個資料 無法區分
UNIQUE 不能重複 但是可以為空 這樣也不能唯一標識
UNIQUE NOT NULL 不能為空且唯一 可以唯一標識一條資料 書寫順序無所謂


UNIQUE NOT NULL 與 主鍵的區別
UNIQUE NOT NULL 不能被其他表引用 (不能作為其它表的外來鍵)
UNIQUE NOT NULL 約束一個表中可以有多個 但是主鍵只能有一個
#unique:限制欄位的值唯一

#單列唯一
create table t16(
id int unique,
name char(16)
);

# 聯合唯一
create table server(
id int unique,
ip char(15),
port int,
unique(ip,port) #!!!!!
);

索引:用於加速查詢
InnoDB 中 索引是樹形結構
為了提高查詢效率 InnoDB為找一個不為空 且唯一的欄位作為主鍵
如果表中不存在這樣的欄位 會自動幫你建一個隱藏主鍵欄位 但是無法提升查詢效率

只要是使用innoDB 就應該為每個表指定一個非空 且唯一的欄位
InnoDB阻止資料時 首先使用主鍵 如果沒有主鍵 找一個非空且唯一 如果也沒有 建一個隱藏欄位


多欄位聯合主鍵: 不常用
學生表 stu_id course_id 做為聯合主鍵,只有當兩個欄位都重複才算重複
1 1 已有資料
1 2 可以插入
2 1 可以插入
1 1 不能插入

#primary key:單單從約束角度去看,primary key就等同於not null unique
#強調(******)
1、一張表中必須有,並且只能有一個主鍵
2、一張表中都應該有一個id欄位,而且應該把id欄位做成主鍵
如一張表中沒有主鍵,第一個not null unique的欄位會預設成為主鍵

create table t17(
id int primary key,
name char(16),
age int,
sex char(6)
)engine=innodb;

#聯合主鍵
create table t19(
ip char(15),
port int,
primary key(ip,port) #!!!!
);




# auto_increment注意點:
1、通常與primary key連用,而且通常是給id欄位加
2、auto_incremnt只能給被定義成key(unique key,primary key)的欄位加

# primary key auto_increment
create table t20(
id int primary key auto_increment,
name char(16)
)engine=innodb;

當一個表中 由於業務需求沒有一個非空且唯一的欄位時 我們可以建一個新的欄位專門作為主鍵
管理主鍵的值挺麻煩的 你得記錄上一次的主鍵值
mysql可以幫你自動管理主鍵 auto_increment 自動增長
auto_increment 只能用於整型欄位 並且該欄位必須具備索引
所以 通常 主鍵都會加上auto_increment

手動修改自動增長計數
alter table 表名 auto_increment 新的值;
注意:如果新的值小於當前的最大值 是無效的

通常建一個表就要建一個主鍵 主鍵的型別通常是整型


儲存引擎
發動機
汽油機
柴油機 柴油價格便宜 動力還強 噪音大 不完全燃燒
電機 加速快 噪音小 續航問題

一個產品或服務的核心部分稱之為引擎
mysql的核心功能存取資料
mysql儲存引擎就是負責存取資料那一段程式碼


小結
建表完整語句
資料型別
整數(長度) 顯示寬度 與存取沒有關係
char定長 varchar可變長
sql_mode 嚴格模式
儲存引擎