1. 程式人生 > >Python學習_day43_mysql表操作2

Python學習_day43_mysql表操作2

insert not 三種 erro 輸入數據 mar pre images lob

一、完整性約束

  約束條件與數據類型寬度相似,都是可選參數,主要用於保證數據的完整性和一致性。

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 | | +---------+--------------+------+-----+---------+-------+ rows
in 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