mysql學習筆記-2
約束
- 約束保證資料的完整性與一致性
- 約束分為表級約束和列級約束
- 約束型別包括 -- NOT NULL (非空約束) -- PRIMARY KEY (主鍵約束) -- UNIQUE KEY (唯一約束) -- DEFAULT (預設約束) -- FOREIGN KEY (外來鍵約束)
外來鍵約束的要求解析
FOREIGN KEY 保證資料的一致性,完整性. 實現一對一或一對多關係
- 父表與子表必須使用相同的儲存引擎,而且禁止使用臨時表.
- 資料表的儲存引擎只能為InnoDB
- 外來鍵列和參照列必須具有相似的資料型別.其中數字的長度或者是否有符號位必須相同;而字元的長度則可以不同.
- 外來鍵列和參照列必須建立索引.如果外來鍵列不存在索引的話,MySQL將自動建立索引
顯示資料表的建立資料
SHOW CREATE TABLE tbl_name;
顯示資料表索引
SHOW INDEXES FROM tbl_name;
建立兩個表並且進行外來鍵約束
``` CREATE TABLE provinces( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, pname VARCHAR(20) NOT NULL );
CREATE TABLE users( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY(pid) REFERENCES provinces(id) );
``` 外來鍵與主鍵資料型別必須的一直 比如 pname SMALLINT 對應的 pid SMALLINT 而且符號位也必須相同 有外來鍵的表稱為子表 子表參照的表稱為附表 參照列自動建立了索引
外來鍵約束的參照操作
- CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行
- SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL.如果使用該選項,必須保證子表列沒有指定NOT NULL.
- RESTRICT:拒絕對父表的刪除或更新操作.
- NO ACTION:標準的SQL關鍵字,在MYSQL中與RESTRICT相同.
外來鍵約束僅僅支援innodb引擎
CREATE TABLE user1(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY(pid) REFERENCES provinces(id) ON DELETE CASCADE
);
參照操作需要開啟ON DELETE後再加上引數
新增資料
``` INSERT provinces(pname) VALUES("A"); INSERT provinces(pname) VALUES("B"); INSERT provinces(pname) VALUES("C");
//插入使用者資料
INSERT user1(username,pid) VALUES("Tom",3); ``` 插入使用者資料只需要對應設定外來鍵的id即可.
如果記錄沒有寫入成功,但是編號會自動遞增
刪除記錄
刪除provinces id為3的記錄
DELETE FROM provinces WHERE id = 3;
那麼相應的子表中外來鍵id為3的也會刪除.
表級約束與列級約束
- 對一個資料列建立的約束,稱為列級約束.
- 對多個資料列建立的約束,稱為表級約束.
- 列級約束既可以在列定義時宣告,也可以在列定義後宣告.
- 表級約束只能在列定義後宣告.
修改資料表
新增單列
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]
FIRST 指的是插入的這一列會在最前面.AFTER col_name則是在某一列後面
新增單列資料
SHOW COLUMNS FROM user1;
ALTER TABLE user1 ADD age INT UNSIGNED NOT NULL DEFAULT 10;
ALTER TABLE user1 ADD password VARCHAR(32) NOT NULL AFTER username;//插入某列後面
ALTER TABLE user1 ADD truename VARCHAR(20) NOT NULL FIRST;
DEFAULT:未明確表明資料的時候.預設指定的資料
UNSIGNED:針對數值型型別 是否有符號
新增多列
新增多列無法指定位置
ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition);
給user1新增多列資料
ALTER TABLE user1 ADD(
num INT UNSIGNED NOT NULL DEFAULT 1,
sex ENUM("男","女") NOT NULL DEFAULT "男"
);
刪除列
ALTER TABLE user1 DROP truename;
刪除多列
ALTER TABLE user1 DROP truename,DROP password;
修改列的時候可以刪除的時候再新增.中間通過逗號分隔.
刪除的同時再新增列
ALTER TABLE user1 DROP num, ADD pm FLOAT UNSIGNED DEFAULT 15;
新增主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name,...)
範例一
CREATE TABLE user2(
username VARCHAR(20) NOT NULL,
pid SMALLINT UNSIGNED
);
//增加主鍵
ALTER TABLE user2 ADD id SMALLINT UNSIGNED;
//增加主鍵約束
ALTER TABLE user2 ADD CONSTRAINT PK_user2_id PRIMARY KEY (id);
CONSTRAINT:用來起別名
新增唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type](index_col_name,...)
範例一
ALTER TABLE user2 ADD UNIQUE (username);
新增外來鍵約束
範例一
user2中pid參照provinces;
ALTER TABLE user2 ADD FOREIGN KEY (pid) REFERENCES provinces (id);
新增/刪除預設約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
範例一
ALTER TABLE user2 ADD age TINYINT UNSIGNED NOT NULL;
ALTER TABLE user2 ALTER age SET DEFAULT 15;
給age新增預設約束
刪除主鍵約束
任何一個表有且只有一個主鍵
ALTER TABLE user2 DROP PRIMARY KEY;
刪除主鍵索引
ALTER TABLE user2 DROP INDEX username;
刪除的僅僅是索引
顯示索引列表名稱
SHOW INDEXes FROM user2;
刪除外來鍵約束
刪除約束是刪除約束的名稱
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbok
範例
``` //查詢外來鍵名稱
SHOW CREATE TABLE user2; //找到pid的外來鍵名稱為 user2_ibfk_1;然後進行刪除
ALTER TABLE user2 DROP FOREIGN KEY user2_ibfk_1;
雖然外來鍵不在了,但是索引還是存在的 如果不想要索引則刪除即可
ALTER TABLE user2 DROP INDEX pid;
```
修改列定義和更名資料表
修改列定義
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST |AFTER col_name]
修改列順序
ALTER TABLE user2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;
column_definition指的是列定義 不變
修改列定義-範例
ALTER TABLE user2 MODIFY id TINYINT UNSIGNED NOT NULL;
修改列定義的時候有可能會造成資料的丟失.
修改列名稱
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new col_name column_definition [FIRST |AFTER col_name]
修改id的型別與名稱
ALTER TABLE user2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;
資料表更名
一.
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name;
二.
RENAME TABLE tbl_name TO new_tbl_name [,tbl_name2 TO new_tbl_name2];
範例 ``` ALTER TABLE user2 RENAME users2;
RENAME TABLE users2 TO user2; ```
總結
約束 - 按功能化為:NOT NULL,PRIMARY KEY, UNIQUE KEY, DEFAULT,FOREIGN KEY - 按資料列的數目化為:表級約束,列級約束
修改資料表 - 針對欄位的操作:新增/刪除欄位,修改列定義,修改列名稱等 - 針對約束的操作:新增/刪除各種約束. - 針對資料表的操作:資料表更名(兩種方式).
列級約束:只能應用於一列上。 表級約束:可以應用於一列上,也可以應用在一個表中的多個列上。
預設約束(DEFAULT)與非空約束(NOT NULL)不存在表級約束
相關文章
- MySQL學習筆記2MySql筆記
- MySql學習筆記MySql筆記
- 【記錄】MySQL 學習筆記MySql筆記
- [記錄] MySQL 學習筆記MySql筆記
- MySql學習筆記06MySql筆記
- mysql學習筆記3MySql筆記
- MySQL學習筆記:鎖MySql筆記
- react學習筆記2React筆記
- Vue學習筆記2Vue筆記
- 學習筆記2(下)筆記
- RocketMQ學習筆記 2MQ筆記
- Python學習筆記(2)Python筆記
- Solidity學習筆記-2Solid筆記
- vue學習筆記-2Vue筆記
- hibernate學習筆記(2)筆記
- MySQL學習筆記之一MySql筆記
- mysql8.0學習筆記MySql筆記
- MySQL學習筆記:索引失效MySql筆記索引
- koa2學習筆記筆記
- 2-SAT 學習筆記筆記
- Grub2 學習筆記筆記
- 一千行 MySQL 學習筆記MySql筆記
- 一千行MySQL學習筆記MySql筆記
- Mysql 優化(學習筆記二十)MySql優化筆記
- Mysql學習筆記(安裝篇)MySql筆記
- MYSQL學習筆記14: 函式MySql筆記函式
- MySQL學習筆記【基礎篇】MySql筆記
- MySQL高階學習筆記(二)MySql筆記
- MySQL學習筆記---入門使用MySql筆記
- MySQL資料庫學習筆記MySql資料庫筆記
- 強化學習-學習筆記2 | 價值學習強化學習筆記
- 資料庫mysql學習筆記記錄資料庫MySql筆記
- <node.js學習筆記(2)>Node.js筆記
- CryptoZombies學習筆記——Lesson2筆記
- Spring Boot 學習筆記(2):JDBCSpring Boot筆記JDBC
- python爬蟲—學習筆記-2Python爬蟲筆記
- 學習筆記-d2l筆記
- ASP.NET學習筆記2ASP.NET筆記
- Ext2.x學習筆記筆記