Python學習_day43_mysql表操作2
一、完整性約束
約束條件與數據類型寬度相似,都是可選參數,主要用於保證數據的完整性和一致性。
1、not null與default
null 為可為空,表默認即為null,可以插入空內容:
not null為非空,不可以插入空內容,輸入空會報錯:
設置default默認值後,無論是是null還是not null,都可以輸入空,輸空以後取默認設置的那個值:
設置為空,輸入空的情況:
設置不為空,輸入為空的情況:
2、unique
設置唯一性約束,如下例,若第二次此字段輸入的數據與上一次相同則會報錯。當然下例也可以通過命令:create table t22(id int,name char(10),sex char(10),constraint uk_name unique(name));實現。
設置聯合唯一情況如下:
3、primary key
primary key 字段不為空且唯一,一個表中只能有一個主鍵primary key,not null +unique也有同樣的功效,但是primary key 只能有一個,not null unique可以有多個。
============單列做主鍵=============== #方法一:not null+unique create table department1( id int not null unique, #主鍵 name varchar(20) not null unique, comment varchar(100) ); mysql> desc department1; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | UNI | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ rowsin set (0.01 sec) #方法二:在某一個字段後用primary key create table department2( id int primary key, #主鍵 name varchar(20), comment varchar(100) ); mysql> desc department2; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ rows in set (0.00 sec) #方法三:在所有字段後單獨定義primary key create table department3( id int, name varchar(20), comment varchar(100), constraint pk_name primary key(id); #創建主鍵並為其命名pk_name mysql> desc department3; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ rows in set (0.01 sec)
==================多列做主鍵================ create table service( ip varchar(15), port char(5), service_name varchar(10) not null, primary key(ip,port) ); mysql> desc service; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | ip | varchar(15) | NO | PRI | NULL | | | port | char(5) | NO | PRI | NULL | | | service_name | varchar(10) | NO | | NULL | | +--------------+-------------+------+-----+---------+-------+ rows in set (0.00 sec) mysql> insert into service values -> (‘172.16.45.10‘,‘3306‘,‘mysqld‘), -> (‘172.16.45.11‘,‘3306‘,‘mariadb‘) -> ; Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into service values (‘172.16.45.10‘,‘3306‘,‘nginx‘); ERROR 1062 (23000): Duplicate entry ‘172.16.45.10-3306‘ for key ‘PRIMARY‘
4、auto_increment
用於約束的字段可以自動增長,但是被約束的字段必須也被key約束,否則報錯。
設置為自增字段後,該字段不輸入數據時會按照默認進行自增。
對於自增的字段用delete刪除後,再插入數值後,該字段仍舊按照刪除前的位置進行增長:
為解決這個問題必須使用truncate進行清空表操作,此命令會將表全部內容清空:
自增字段起始值和自增步長默認均為1,在創建表的時候可以在括號外指定auto_increment的起始值:
此外可以通過如下指令設置自增字段的的起始值(auto_increment_offset)和自增步長(auto_increment_increment),需要註意的是設置的起始值一定要小於等於自增步長,否則設置不成功。
#基於會話級的設置:此會話內創建的表有效,關閉會話後設置無效 set session auto_increment_increment=3; set session auto_increment_offset=2; #基於全局級的設置:所有會話內都有效,但是設置完後需要重新登錄 set global auto_increment_increment=3; set global auto_increment_offset=2;
以全局級設置為例如下:
5、foreign key
稱為外鍵,主要用來關聯幾個有關系的表,如有一個員工的信息表,員工信息表有三個字段:工號 姓名 部門,公司有3個部門,但是有1個億的員工,那意味著部門這個字段需要重復存儲,部門名字越長,越浪費。解決方法:我們完全可以定義一個部門表,然後讓員工信息表關聯該表,如何關聯,即foreign key。
#表類型必須是innodb存儲引擎,且被關聯的字段,即references指定的另外一個表的字段,必須保證唯一 create table department( id int primary key, name varchar(20) not null )engine=innodb; create table employee( id int primary key, name varchar(20) not null, dpt_id int, foreign key(dpt_id) references department(id) #關聯語句 on delete cascade #保證同步刪除 on update cascade #保證同步更新 )engine=innodb; #先往父表department中插入記錄 insert into department values (1,‘歐德博愛技術有限事業部‘), (2,‘艾利克斯人力資源部‘), (3,‘銷售部‘); #再往子表employee中插入記錄 insert into employee values (1,‘egon‘,1), (2,‘alex1‘,2), (3,‘alex2‘,2), (4,‘alex3‘,2), (5,‘李坦克‘,3), (6,‘劉飛機‘,3), (7,‘張火箭‘,3), (8,‘林子彈‘,3), (9,‘加特林‘,3) ; #刪父表department,子表employee中對應的記錄跟著刪 mysql> delete from department where id=3; mysql> select * from employee; +----+-------+--------+ | id | name | dpt_id | +----+-------+--------+ | 1 | egon | 1 | | 2 | alex1 | 2 | | 3 | alex2 | 2 | | 4 | alex3 | 2 | +----+-------+--------+ #更新父表department,子表employee中對應的記錄跟著改 mysql> update department set id=22222 where id=2; mysql> select * from employee; +----+-------+--------+ | id | name | dpt_id | +----+-------+--------+ | 1 | egon | 1 | | 3 | alex2 | 22222 | | 4 | alex3 | 22222 | | 5 | alex1 | 22222 | +----+-------+--------+
表與表之間的三種關系:
分析步驟: #1、先站在左表的角度去找 是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個字段foreign key 右表一個字段(通常是id) #2、再站在右表的角度去找 是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的一個字段foreign key 左表一個字段(通常是id) #3、總結: #多對一: 如果只有步驟1成立,則是左表多對一右表 如果只有步驟2成立,則是右表多對一左表 #多對多 如果步驟1和2同時成立,則證明這兩張表時一個雙向的多對一,即多對多,需要定義一個這兩張表的關系表來專門存放二者的關系 #一對一: 如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,就是在左表foreign key右表的基礎上,將左表的外鍵字段設置成unique即可
(1)一對多
如一個部門對應多個員工,員工信息一個表,部門信息一個表,則員工信息表中的部門信息就可以通過foreign key進行關聯。
首先建立部門表:
創建員工信息表,其中部門信息通過id關聯:
(2)多對多
(3)一對一
Python學習_day43_mysql表操作2