從0到1學資料庫:表和約束
技術標籤:0-1資料庫
點選上方“羅曉勝”,馬上關注,您的支援對我幫助很大
上期文章
/ 前言 /
前面我們都是學習怎麼操作資料,下面我們學習怎麼去操作表,對錶結構進行增刪改查。
/ 正文 /
本章要點
• 建立表
• 修改表
• 刪除表
• 重新命名
• 截斷表
• 資料完整性約束
資料庫物件命名原則
• 資料庫物件命名原則 – 必須由字母開始,長度在 1–30個字元之間。– 名字中只能包含 A–Z, a–z, 0–9, _ (下劃線),$ 和 #。– 同一個資料庫伺服器使用者所擁有的物件名字不能重複。– 名字不能為資料庫的保留字。– 名字是大小寫不敏感
注:詳情可參考本專案-mysql開發規範
建表語句語法
• 建表語法 CREATE TABLE [schema.]table (column datatype [DEFAULT expr][, ...]);
用子查詢語法建立表
• 使用子查詢建立表的語法
CREATE TABLE table[(column, column...)] AS subquery;
• 新表的欄位列表必須與子查詢中的欄位列表匹配 • 欄位列表可以省略
CREATE TABLE student2 AS SELECT id, name, age+10 newAge FROM student WHERE id = 1;
• Select列表中的表示式列需要給定別名,如果沒有別名會產生錯誤
表的分類
MySQL 資料表主要支援六種型別 ,分別是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。
-
事務安全型(transaction-safe):
-
BDB:Mysql最早的具有事務能力的表的型別,目前已經停止開發
-
InnoDB:在MySQL 5.1之前的版本中,預設的搜尋引擎是MyISAM,從MySQL 5.5之後的版本中,預設的搜尋引擎變更為InnoDB。
-
-
非事務安全型(non-transaction-safe):
-
HEAP:是MySQL表中訪問最快的表,將所有資料儲存在RAM中,在需要快速查詢引用和其他類似資料的環境下,可提供極快的訪問(注意,這種型別下資料是非持久化設計的,它一般適應於臨時表,如果MySQL或者伺服器崩潰,表中資料全部丟失。)
-
ISAM:是MyISAM型別出現之前MySQL表使用的預設型別,現在已經被MyISAM代替。
-
MERGE:由一組MyISAM表組成,之所合併主要出於效能上考慮,因為它能夠提高搜尋速度,提高修復效率,節省磁碟空 間
-
MYISAM:基於ISAM型別,但它增加了許多有用的擴充套件,它是在Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一
-
資料型別與列定義
數值型別
型別 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 bytes (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 | |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度、浮點數值 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度、浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴於M和D的值 | 依賴於M和D的值 |
日期和時間型別:表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。每個時間型別有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。TIMESTAMP型別有專有的自動更新特性,將在後面描述。
型別 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
DATE | 3 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 | |
TIME | 3 '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 | |
YEAR | 1 1901/2155 | YYYY | 年份值 | |
DATETIME | 8 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 | |
TIMESTAMP | 4 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
字串型別:字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。
型別 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定長字串 |
VARCHAR | 0-65535 bytes | 變長字串 |
TINYBLOB | 0-255 bytes | 不超過 255 個字元的二進位制字串 |
TINYTEXT | 0-255 bytes | 短文字字串 |
BLOB | 0-65 535 bytes | 二進位制形式的長文字資料 |
TEXT | 0-65 535 bytes | 長文字資料 |
MEDIUMBLOB | 0-16 777 215 bytes | 二進位制形式的中等長度文字資料 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等長度文字資料 |
LONGBLOB | 0-4 294 967 295 bytes | 二進位制形式的極大文字資料 |
LONGTEXT | 0-4 294 967 295 bytes | 極大文字資料 |
修改表的定義
-
修改表名 ALTER table tablename rename to newtablename;
-
新增列語法:ALTER TABLE table ADD (columnname datatype[DEFAULT expr] [, columnname datatype]...);
-
修改列語法:ALTER TABLE table MODIFY(columnname datatype[DEFAULT expr] [, columnname datatype]...);
-
刪除列語法:ALTER TABLE table DROP (columnname [,columnname]);
示例:
-- 修改表名
ALTER table student rename to newstudent;
-- 新增列
ALTER TABLE student ADD column c_weight int(5) not null comment '體重' AFTER `age`; //在哪個欄位後面新增
-- 修改列
ALTER TABLE student MODIFY c_weight varchar(20) COMMENT '體重';
-- 刪除列
ALTER TABLE student DROP c_weight;
新增新列
ALTER TABLE table ADD (columnname datatype[DEFAULT expr] [, columnname datatype]...);
• 增加列原則:– 可以新增或修改列 – 可指定新新增列的位置,使用AFTER欄位
。
修改已存在的列
• 列的修改可以修改資料型別,長度,及預設值。• 修改資料型別:已有的行資料必須為空。• 修改長度原則:數值型修改長度:當長度向小改時,已有行的數該列必須為空;當長度向大改時,可以隨意修改。字元型修改長度:當長度向小改時,只要修改後的值能容納下 當前已有資料的最大值即可,當長度向大改時,可以隨意修改。• 修改列的預設值:
-預設值的修改不會影響已經存在的行,隻影響新增加的行
• 把student表年齡(age) 列,修改為長度為2 ALTER TABLE student MODIFY age CHAR(2);
• 新增預設值 ALTER TABLE student MODIFY age DEFAULT ‘1’;
刪除列
• 可以用DROP子句從表中刪除列,包括列的定義和資料。• 刪除列原則:
– 列可以有也可以沒有資料。– 表中至少保留一列。– 列被刪除後,不能再恢復。– 被外來鍵引用的列,不能被刪除。
• 刪除列語法一 ALTER TABLE emp student COLUMN age;
• 刪除列語法二 ALTER TABLE table student (columnname[,columnname]);
• 刪除student表的兩個欄位“name”和“age”。ALTER TABLE student DROP (name,age);
刪除、重新命名與截斷表
刪除表
• 刪除表語法:
DROP TABLE table;
– 只有表的建立者 – 或具有DROP ANY TABLE許可權的使用者才能刪除表
• 刪除表原則:– 表中所有的資料和結構都被刪除。– 任何檢視和同義詞被保留但無效。– 所有與其相關的約束和索引被刪除。– 任何未完成的事務被提交。
示例 DROP TABLE student;
重命名錶
• 重新命名語句語法:alter table RENAME old_name TO new_name; – 必須是物件的所有者
• 把emp表重新命名為empl alter table test_a rename to sys_app;
截斷表
• 截斷表語法:TRUNCATE TABLE table;
– 執行TRUNCATE語句的前提,必須是表的所有者 – 或者有DELETE ANY TABLE系統許可權來截斷表。
示例:TRUNCATE TABLE emp;
備註:清空表和截斷表的區別 清空表:delete from users;清空表只是清空表中的邏輯資料,但是物理資料不清除,如主鍵值、索引等不被清除,還是原來的值。
截斷表:truncate table users;截斷表可以用於刪除表中 的所有資料。截斷表命令還會回收所有索引的分配頁
約束的概念
• 約束 (constraints) 是防止無效資料輸入到表中。約束做下面的事:– 多個表之間的具體關係,比如兩個表之間的主外來鍵關係。– 表在插入、更新行或者刪除行的時候強制表中的資料遵循 約束規則。– 對於成功的操作,約束條件是必須被滿足的。– 如果表之間有依賴關係,使用約束可以防止表或表中相關 資料的刪除。
• 約束命名 – 約束命名原則:所有的約束定義儲存在資料字典中。– 如果給約束一個有意義的名字,約束易於維護,約束命名 必須遵守標準的物件命名規則。– 如果沒有給約束命名,Oracle伺服器將用預設格式 SYS_Cn產生一個名字,這裡 n 是一個唯一的整數,來保 證名稱的唯一性。– 建議至少應該給表的主、外來鍵按照命名原則來命名,如可 以採用這樣的原則來命名,表名_欄位名_約束型別。
約束的型別
約束 | 說明 |
---|---|
NOT NULL | 指定列不能包含空值 |
DEFAULT | 預設值,用於保證該欄位有預設值。 |
UNIQUE | 指定列的值或者列的組合的值對於表中所有的行必須 是唯一的 |
PRIMARY KEY | 表的每行的唯一性標識 |
FOREIGN KEY | 在列和引用表的一個列建立並且強制的列之間關係 |
CHECK | 指定一個必須為真的條件 |
生成與維護約束
• 約束的語法如下:CREATE TABLE [schema.] table (column datatype [ DEFAULT expr][column_constraint], ...[table_constraint][,...]);
– 約束可以在兩個級別上定義,表級約束與列級約束。– 列級約束能夠定義完整性約束的任何型別。– 表級約束除了NOT NULL之外,能夠定義完整性約束的任 何型別。
示例
create table if not exists t_stuinfo(
id int primary key, #主鍵
stuName varchar(20) not null, #非空
gender char(1) check(gender='男' or gender='女'), #檢查約束,MySql沒有效果但不報錯
seat int unique, #唯一約束
age int default 18, #預設(值)約束
majorId int references major(id) #外來鍵約束,MySql沒有效果,但不報錯
);
現有表中增加/刪除約束
• 增加約束語法如下:ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
• 刪除約束語法 Alter TABLE tablename Drop Primary key | Unique (column)| Constraint constraint [Cascade]
示例:
-- 新增非空約束
alter table 表名稱 modify column 列名 列型別 not null;
-- 新增預設約束
alter table 表名稱 modify column 列名 列型別 default 預設值;
-- 新增主鍵
alter table 表名稱 modify column 列名 列型別 primary key;
alter table 表名稱 add primary key(id);
-- 刪除預設約束
alter table 表名稱 modify column 列名 列型別;
-- 刪除主鍵
Alter table student modify column id int;;
Alter table student drop primary key;
-- 刪除唯一
alter table 表名稱 drop index(索引名) 設定唯一時的名稱;
約束的啟用和禁用
• 禁用約束 – 如果有大批量資料匯入時,我們可以採用禁用約束的方法, 主要的好處,首先效率高,另外有主外來鍵約束的表之間導 入時,不用考慮匯入的先後順序。
• 禁用外來鍵約束語法:SET FOREIGN_KEY_CHECKS=0;
• 啟用約束語法:SET FOREIGN_KEY_CHECKS=1;
/ 總結 /
本文主要講了如何修改表結構等資訊,在表建立有問題或者需要拓展時,可以參考文中的操作方法。
往期推薦:
關注我的公眾號,學習技術或投稿
長按上圖,識別圖中二維碼即可關注