天天看點

MySQL必知必會-第21章 建立和操作表【CREATE、ALTER、DROP】

建立和操作表

MySQL不僅用于表資料的操縱,還用于執行資料庫和表的所有操作,包括表本身的【建立】和【處理】

1)使用具有互動式建立和管理表的工具;

2)使用MySQL語句操作。

1.建立表

1.1 表建立基礎

-- 1.建立表的總體文法
CREATE TABLE 新表名 [IF NOT EXISTS](
	列名1 類型 其他要求,
	列名2 類型 其他要求,
	...
)ENGINE=InnoDB; // 要指定建立表使用的資料庫引擎
-- 2.建立表的具體例子
CREATE TABLE customers(
	cust_id 		int 		NOT NULL AUTO_INCREMENT,
	cust_name 		char(50) 	NOT NULL,
	cust_address	char(50)	NULL,
	cust_city		char(50)	NULL,
	cust_state		char(5)		NULL,
	cust_zip		char(10)	NULL,
	cust_country	char(50)	NULL,
	cust_contact	char(50)	NULL,
	cust_email		char(255)	NULL,
	PRIMARY KEY(cust_id)
)ENGINE=InnoDB;
           

【說明】

1)新表明緊跟在CREATE TABLE關鍵字之後;

2)實際表的列的定義都放在 “圓括号” 之中;

3)各列定義 采用 “列名 列資料類型 列的其他要求” 的格式,各列之間用 “逗号” 隔開;

4)建立表時,要求指定的表名必須不存在;為了防止覆寫已有的表,SQL要求首先手工删除原有的表,然後在重建它,而不是簡單地用建立語句覆寫它

5)建立表時,盡量使用 IF NOT EXISTS關鍵字,僅在指定的表名不存在的時候建立表;

1.2 使用NULL值

1)NOT NULL 表示該列不允許為空,阻止該列為空的值插入;

2)NULL 表示設定該列的預設值,當不指定NOT NULL和NULL的時候,預設是NULL;

3)【差別NULL和空串’’】

a.NULL 是沒有值,它不是空串;

b.如果指定為’’,這樣的值在NOT NULL列是允許的,’'也算是有效值;

1.3 介紹主鍵

主鍵必須唯一,如果主鍵由多個列構成,那麼這些列的組合必須唯一

-- 用多個列組合成主鍵
PRIMARY KEY(列名1,列名2, ...)
           

主鍵唯一辨別表中的每個行,是以,隻能使用NOT NULL的列;

1.4 使用AUTO_INCREMENT

1)每次執行一個INSERT操作時,MySQL自動對該列增量;

2)一個表隻允許一個AUTO_INCREMENT列,且這個列必須被索引(讓列成為主鍵可以使列被索引)

3)【自增值可覆寫】設定為AUTO_INCREMENT的字段可以在INSERT語句中指定一個值val,隻要它是唯一的,就可以用來代替/覆寫自動生成的值;後續的增量将從val開始計算;

4)【自增值可獲得】可以通過**select LAST_INSERT_ID()**來獲得最新的增量數值,假如使用一條INSERT語句插入多個行, LAST_INSERT_ID() 隻傳回插入的第一行資料時産生的值;

1.5 指定預設值

-- 使用default設定預設值
	列名 列資料類型 NOT NULL DEFAULT 預設值;
           

【說明】

1)MySQL和大多數DBMS不一樣,隻允許使用常量作為預設值,不允許使用函數作為預設值;

2)應該盡量使用 預設值列-“DEFAULT 預設值”,避免使用 NULL列;

1…6 資料庫引擎類型

1)MySQL打包了多種資料庫引擎,根據具體任務選擇正确的引擎能夠獲得更好的性能和靈活性;

2)幾個需要知道的資料庫引擎

a.InnoDB:可靠的事務處理引擎,不支援全文本搜尋;

b.MyISAM:不支援事務處理,但性能極高,支援全文本搜尋;

c.MEMORY:功能與MyISAM類似,資料存儲在記憶體(而不是硬碟),速度很快,适合存儲臨時表;

3)一個資料庫裡的多個表可以使用多個不同的資料庫引擎,根據需要而定(支援事務處理 或是 支援全文本搜尋);在混合引擎的情況下,外鍵不能跨引擎

4)更多有關引擎的知識參考:

中文連接配接:https://www.mysqlzh.com/doc/213.html

英文連接配接:https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

2.更新表

2.1 更新表的列

盡量在設計表的時候就考慮完善,避免對表進行較大的改動;

更多詳細參考:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

-- 1.更新表基本文法
ALTER TABLE 表名
ADD COLUMN 新增列名 新列的資料類型 新列的其他要求, 			--增加列
DROP COLUMN 要删除的列名,									--删除列
RENAME COLUMN 舊列名TO 新列名,							--隻修改列名
MODIFY COLUMN 要修改的列名 新列的資料類型 新列的其他要求,		--隻修改列的類型和要求
CHANGE COLUMN 舊列名 新列名 新列名的資料類型 新列名的其他要求;--同時更改列名和列屬性

-- 2.簡單的例子
-- 增加列
ALTER TABLE students
ADD COLUMN stu_address char(255);
-- 删除列
ALTER TABLE students
DROP COLUMN stu_address;
-- 【增加外鍵限制】
ALTER TABLE student_scores
ADD CONSTRAINT fk_ss_s -- 增加限制 ADD CONSTRAINT 限制名
-- FOREIGN KEY(該表某列) REFERENCES 另一張表(另一張表的主鍵); 
FOREIGN KEY(scor_stu_id) REFERENCES students(stu_id); 
           

【說明】

1)更改不同的表需要用到多個ALTER TABLE子句,修改一個表的多個列,可以隻使用一個AlTER TABLE語句,然後用逗号将每個更改分隔開;

2)複雜表結構的更改一般需要手動删除的過程:

a.用新的列布局建立一個新表; – 【這裡已經更新了列】

b.使用INSERT SELECT語句導入舊表資料到新表中;-- 【舊表相當于備份】

c.檢驗包含所有資料的新表是否符合需要;-- 【檢驗新表的正确性】

d.重命名舊表(确定時可删除舊表),用舊表原來的名字重命名新表;

e.根據需要,重新建立【觸發器】【存儲過程】【索引】【外鍵】;

2.2 更新表(重命名表)

-- 可以一次重命名一張表,也可以一次重命名多張表,用逗号分隔開
RENAME TABLE 舊表名1 TO 新表名1,
			 舊表名2 TO 新表明2,
			 ....   TO ...;
           

3.删除表

-- 删除表 可以一次性删除一張表,也可以一次性删除多張表,用逗号分隔開
DROP TABLE 表名1, 表明2,...;
           

【說明】

1)删除表,是删除整張表,包括表的結構和内部的資料;

2)删除表,不會提示使用者是否确認删除,也不能撤銷!!!

繼續閱讀