python 之 資料庫(欄位的約束條件,表之間的關係)

来源:https://www.cnblogs.com/mylu/archive/2019/08/01/11285625.html
-Advertisement-
Play Games

10.6 約束條件 10.61 not null 、default 10.62 unique mysql中存在一種專門的數據結構,叫 key,又稱為索引,通過該數據結構可以減少 i/o 次數,從而加速查詢效率 index key : 只有加速查詢的效果,沒有約束的功能 unique key:不僅有加 ...


10.6 約束條件

10.61 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');
​
mysql> desc t15;
+-------+-------------------------------+------+-----+---------+-------+
| Field | Type                          | Null | Key | Default | Extra |
+-------+-------------------------------+------+-----+---------+-------+
| id    | int(11)                       | YES  |     | NULL    |       |
| name  | char(16)                      | NO   |     | NULL    |       |
| sex   | enum('male','female','other') | NO   |     | male    |       |
+-------+-------------------------------+------+-----+---------+-------+
​
mysql> select * from t15;
+------+-------+------+
| id   | name  | sex  |
+------+-------+------+
|    1 | egon1 | male |
|    2 | egon2 | male |
|    3 | egon3 | male |
+------+-------+------+

10.62 unique

mysql中存在一種專門的數據結構,叫 key,又稱為索引,通過該數據結構可以減少 i/o 次數,從而加速查詢效率 index key : 只有加速查詢的效果,沒有約束的功能 unique key:不僅有加速查詢的效果,還附加了一種約束的功能 primary key:不僅有加速查詢的效果,還附加了一種約束的功能,並且innodb存儲引擎會按照主鍵欄位的值 來組織表中所有的數據,所以一種inndob表中必須有、而且只能有一個主鍵,通常為該表的id欄位

unique:限制欄位的值的唯一性,單從約束角度去看:唯一性約束

#單列唯一
create table t16(
    id int unique,
    name char(16)
);
​
# 聯合唯一(不能完全相同)
create table server(
    id int unique,
    ip char(15),
    port int,
    unique(ip,port)
);
mysql> desc server;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  | UNI | NULL    |       |
| ip    | char(15) | YES  | MUL | NULL    |       |
| port  | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
insert into server values(1,'1.1.1.1',3306),(2,'1.1.1.1',3307),(3,'1.1.1.2',3306);
mysql> select * from server;
+------+---------+------+
| id   | ip      | port |
+------+---------+------+
|    1 | 1.1.1.1 | 3306 |
|    2 | 1.1.1.1 | 3307 |
|    3 | 1.1.1.2 | 3306 |
+------+---------+------+

10.63 primary key

primary key:單單從約束角度去看,primary key就等同於 not null + unique 強調: 1、一張表中必須有,並且只能有一個主鍵 2、一張表中都應該有一個id欄位,而且應該把id欄位做成主鍵

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)
);
mysql> desc t19;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip    | char(15) | NO   | PRI |         |       |
| port  | int(11)  | NO   | PRI | 0       |       |
+-------+----------+------+-----+---------+-------+

10.64 auto_increment

只能給被約束成key的欄位加自增屬性,預設起始位置是1,步長也為1

# primary key auto_increment
create table t20(
    id int primary key auto_increment,
    name char(16)
)engine=innodb;
​
mysql> insert t20(name) values('egon1');
mysql> insert t20(name) values('egon2');
mysql> select * from t20;
+----+-------+
| id | name  |
+----+-------+
|  1 | egon1 |
|  2 | egon2 |
+----+-------+

10.7 表關係

10.71 多對一(foreign key)

1、把所有數據都存放於一張表的弊端:

  • 表的組織結構複雜不清晰

  • 浪費空間

  • 擴展性極差

    2、尋找表與表之間的關係的方法: 舉例:emp表 dep表 步驟一: part1: 1、先站在左表emp的角度 2、去找左表emp的多條記錄能否對應右表dep的一條記錄

    part2: 1、站在右表dep的角度 2、去找右表dep的多條記錄能否對應左表emp的一條記錄 3、如何實現? 在emp表中新增一個dep_id欄位,該欄位指向dep表的id欄位

    4、foreign key會帶來什麼樣的效果?

約束1:在創建表時,先建被關聯的表dep,才能建關聯表emp

create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);
mysql> desc dep;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| dep_name    | char(10) | YES  |     | NULL    |                |
| dep_comment | char(60) | YES  |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+
create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
);
mysql> desc emp;
+--------+-----------------------+------+-----+---------+----------------+
| Field  | Type                  | Null | Key | Default | Extra          |
+--------+-----------------------+------+-----+---------+----------------+
| id     | int(11)               | NO   | PRI | NULL    | auto_increment |
| name   | char(16)              | YES  |     | NULL    |                |
| gender | enum('male','female') | NO   |     | male    |                |
| dep_id | int(11)               | YES  | MUL | NULL    |                |
+--------+-----------------------+------+-----+---------+----------------+

約束2:在插入記錄時,必須先插被關聯的表dep,才能插關聯表emp

insert into dep(dep_name,dep_comment) values
('sb教學部','sb輔導學生學習,教授python課程'),
('外交部','形象大使'),
('nb技術部','nb技術能力有限部門');
mysql> select * from dep;
+----+-------------+-------------------------------------------+
| id | dep_name    | dep_comment                               |
+----+-------------+-------------------------------------------+
|  1 | sb教學部    | sb輔導學生學習,教授python課程            |
|  2 | 外交部      | 形象大使                                  |
|  3 | nb技術部    | nb技術能力有限部門                        |
+----+-------------+-------------------------------------------+
insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);
mysql> select * from emp;
+----+---------+--------+--------+
| id | name    | gender | dep_id |
+----+---------+--------+--------+
|  1 | alex    | male   |      1 |
|  2 | egon    | male   |      2 |
|  3 | lxx     | male   |      1 |
|  4 | wxx     | male   |      1 |
|  5 | wenzhou | female |      3 |
+----+---------+--------+--------+

約束3:更新與刪除都需要考慮到關聯與被關聯的關係(不能直接改變dep表的id) 解決方案:

1、先刪除關聯表emp,再刪除被關聯表dep,準備重建
mysql> drop table emp;
mysql> drop table dep;
2、重建:新增功能:同步更新,同步刪除
create table dep(                       #先建被參照的表
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60));
create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id) on update cascade on delete cascade);
insert into dep(dep_name,dep_comment) values
('sb教學部','sb輔導學生學習,教授python課程'),
('外交部','形象大使'),
('nb技術部','nb技術能力有限部門');
mysql> select * from dep;
+----+------------------+------------------------------
| id | dep_name         | dep_comment                  |
+----+------------------+------------------------------
|  1 | sb教學部         | sb輔導學生學習,教授python課程 |
|  2 | 外交部           | 形象大使                      |
|  3 | nb技術部         | nb技術能力有限部門             |
+----+------------------+-------------------------------
insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  1 | alex             | male   |      1 |
|  2 | egon             | male   |      2 |
|  3 | lxx              | male   |      1 |
|  4 | wxx              | male   |      1 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
​
# 同步刪除
mysql> delete from dep where id=1;
mysql> select * from dep;
+----+------------------+------------------
| id | dep_name         | dep_comment     |
+----+------------------+------------------
|  2 | 外交部           | 形象大使          |
|  3 | nb技術部         | nb技術能力有限部門 |
+----+------------------+------------------
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  2 | egon             | male   |      2 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
​
#同步更新
mysql> update dep set id=200 where id =2;
mysql> select * from dep;
+-----+------------------+----------------
| id  | dep_name         | dep_comment   |
+-----+------------------+----------------
|   3 | nb技術部         | nb技術能力有限部|
| 200 | 外交部           | 形象大使        |
+-----+------------------+----------------
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  2 | egon             | male   |    200 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
View Code

10.72 多對多(foreign key)

1、什麼是多對多 兩張表之間是一個雙向的多對一關係,稱之為多對多 2、如何實現? 建立第三張表,該表中有一個欄位是fk左表的id,還有一個欄位是fk右表的id

create table author(
    id int primary key auto_increment,
    name char(16));
create table book(
    id int primary key auto_increment,
    bname char(16),
    price int);
insert into author(name) values
('egon'),
('alex'),
('wxx');
mysql> select * from author;
+----+------+
| id | name |
+----+------+
|  1 | egon |
|  2 | alex |
|  3 | wxx  |
+----+------+
insert into book(bname,price) values
('python從入門到入土',200),
('葵花寶典切割到精通',800),
('九陰真經',500),
('九陽神功',100);
mysql> select * from book;
+----+-----------------------------+-------+
| id | bname                       | price |
+----+-----------------------------+-------+
|  1 | python從入門到入土          |   200 |
|  2 | 葵花寶典切割到精通           |   800 |
|  3 | 九陰真經                    |   500 |
|  4 | 九陽神功                    |   100 |
+----+-----------------------------+-------+
create table author2book(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id) on update cascade on delete cascade,
    foreign key(book_id) references book(id) on update cascade on delete cascade);
insert into author2book(author_id,book_id) values
(1,3),(1,4),(2,2),(2,4),(3,	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Spring AOP中的基本概念 連接點(Joinpoint):在程式執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。在Spring AOP中,一個連接點總是表示一個方法的執行。 通俗的講: 層與層之間調用的過程中,目標層中可供調用的方法,就稱之為連接點。 切入點(Pointcu ...
  • 特殊的算數運算符 以上算術運算符均有對應的賦值運算符: /= //= **= 邏輯運算符 返回值均為bool型。 成員運算符 適用於字元串,列表或元組的成員判斷,返回值均為bool型。 ...
  • 1.synchronized的3種用法 (1)修飾實例方法,作用於當前對象實例加鎖,進入同步代碼前要獲得當前對象實例的鎖(2)修飾靜態方法,作用於當前類對象加鎖,進入同步代碼前要獲得當前類對象的鎖 。也就是給當前類加鎖,會作用於類的所有對象實例,因為靜態成員不屬於任何一個實例對象,是類成員( sta ...
  • Python 可通過 if 語句來實現三目運算的功能,因此可以近似地把這種 if 語句當成三目運算符。作為三目運算符的 if 語句的語法格式如下: 三目運算的規則是:先對邏輯表達式 expression 求值,如果邏輯表達式返回 True,則執行並返回 True_statements 的值;如果邏輯 ...
  • 這是第四個的輸出 ...
  • 不需要導入模塊(內置函數) math模塊 需要先導入math模塊,然後以 math.常量名/函數名的方式調用。 數學常量 e π sin(x)、cos(x)、tan(x) degrees(x) e的x次方 序列指的是列表(List)、元組(Tuple)、字元串(String)。 序列,是有序的,集合 ...
  • 1.簡述 AJAX(Asynchronous Javascript And XML),是一個局部刷新技術,即網頁不需要重新載入,只進行部分更新即可 例如:視頻彈幕,點贊,登錄驗證... 2.JavaScript原生AJAX 步驟: 1.創建XMLHttpRequest核心對象; var 變數名 = ...
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...