1. 程式人生 > 其它 >從0到1學資料庫:表和約束

從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、資料倉儲和其他應用環境下最常使用的儲存引擎之一

資料型別與列定義

數值型別

型別大小範圍(有符號)範圍(無符號)用途
TINYINT1 byte(-128,127)(0,255)
SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整數值
MEDIUMINT3 bytes (-8 388 608,8 388 607)(0,16 777 215)大整數值
INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整數值
BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)極大整數值
FLOAT4 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)單精度、浮點數值
DOUBLE8 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型別有專有的自動更新特性,將在後面描述。

型別大小範圍(有符號)範圍(無符號)用途
DATE3 1000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3 '-838:59:59'/'838:59:59'HH:MM:SS時間值或持續時間
YEAR1 1901/2155YYYY年份值
DATETIME8 1000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和時間值
TIMESTAMP4 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和時間值,時間戳

字串型別:字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。

型別大小用途
CHAR0-255 bytes定長字串
VARCHAR0-65535 bytes變長字串
TINYBLOB0-255 bytes不超過 255 個字元的二進位制字串
TINYTEXT0-255 bytes短文字字串
BLOB0-65 535 bytes二進位制形式的長文字資料
TEXT0-65 535 bytes長文字資料
MEDIUMBLOB0-16 777 215 bytes二進位制形式的中等長度文字資料
MEDIUMTEXT0-16 777 215 bytes中等長度文字資料
LONGBLOB0-4 294 967 295 bytes二進位制形式的極大文字資料
LONGTEXT0-4 294 967 295 bytes極大文字資料

修改表的定義

  1. 修改表名 ALTER table tablename rename to newtablename;

  2. 新增列語法:ALTER TABLE table ADD (columnname datatype[DEFAULT expr] [, columnname datatype]...);

  3. 修改列語法:ALTER TABLE table MODIFY(columnname datatype[DEFAULT expr] [, columnname datatype]...);

  4. 刪除列語法: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;

/ 總結 /

本文主要講了如何修改表結構等資訊,在表建立有問題或者需要拓展時,可以參考文中的操作方法。

往期推薦:

如何入門做軟體開發

為什麼我不推薦入行程式設計師

做全棧開發很難嗎

關注我的公眾號,學習技術或投稿

圖片

長按上圖,識別圖中二維碼即可關注