## 關系
* 創建成績表scores,結構如下
* id
* 學生
* 科目
* 成績
* 思考:學生列應該存什么信息呢?
* 答:學生列的數據不是在這里新建的,而應該從學生表引用過來,關系也是一條數據;根據范式要求應該存儲學生的編號,而不是學生的姓名等其它信息
* 同理,科目表也是關系列,引用科目表中的數據

* 創建表的語句如下
~~~
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2)
);
~~~
## 外鍵
* 思考:怎么保證關系列數據的有效性呢?任何整數都可以嗎?
* 答:必須是學生表中id列存在的數據,可以通過外鍵約束進行數據的有效性驗證
* 為stuid添加外鍵約束
~~~
alter table scores add constraint stu_sco foreign key(stuid) references students(id);
~~~
* 此時插入或者修改數據時,如果stuid的值在students表中不存在則會報錯
* 在創建表時可以直接創建約束
~~~
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);
~~~
## 外鍵的級聯操作
* 在刪除students表的數據時,如果這個id值在scores中已經存在,則會拋異常
* 推薦使用邏輯刪除,還可以解決這個問題
* 可以創建表時指定級聯操作,也可以在創建表后再修改外鍵的級聯操作
* 語法
~~~
alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;
~~~
* 級聯操作的類型包括:
* restrict(限制):默認值,拋異常
* cascade(級聯):如果主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
* set null:將外鍵設置為空
* no action:什么都不做
- mysql
- 1.創建庫和表
- 1.1.數據庫簡介
- 1.2.安裝管理
- 1.3.數據完整性
- 1.4.命令腳本操作
- 2.查詢
- 2.1.條件
- 2.2.聚合
- 2.3.分組
- 2.4.排序
- 2.5.分頁
- 3.高級
- 3.1.關系
- 3.2.連接
- 3.3.自關聯
- 3.4.子查詢
- 3.5.內置函數
- 3.6.視圖
- 3.7.事務
- 4.與python交互
- 4.1.交互類型
- 4.2.增改刪
- 4.3.查詢
- 4.4.封裝
- 4.5.用戶登錄
- Nosql簡介
- mongodb
- 1.基本操作
- 1.1.環境安裝
- 1.2.數據庫操作
- 1.3.集合操作
- 1.4.數據類型
- 1.5.數據操作
- 1.6.數據查詢
- 1.6.1.Limit與Skip
- 1.6.2.投影
- 1.6.3.排序
- 1.6.4.統計個數
- 1.6.5.消除重復
- 2.高級操作
- 2.1.聚合aggregate
- 2.1.1.$group
- 2.1.2.$match
- 2.1.3.$project
- 2.1.4.$sort
- 2.1.5.$limit,$skip
- 2.1.6.$unwind
- 2.2.安全
- 2.3.復制(副本集)
- 2.4.備份和恢復
- 2.5.與python交互
- redis
- 1.基本配置
- 2.數據操作
- 2.1.string
- 2.2.鍵命令
- 2.3.hash
- 2.4.list
- 2.5.set
- 2.6.zset
- 4.高級
- 4.1.發布訂閱
- 4.2.主從配置
- 5.與python交互
- 6.login登陸完善