1. 程式人生 > >MySQL(3)約束以及修改資料表

MySQL(3)約束以及修改資料表

MySQL外來鍵約束的要求解析

約束
1.保證資料的完整性和一致性。
2.分為表級約束和列級約束
3.約束型別包括:
NOT NULL(非空約束)
PRIMARY KEY(主鍵約束)
UNIQUE KEY(唯一約束)
DEFAULT(預設約束)
FOREIGN KEY(外來鍵約束)

FOREIGN KEY(外來鍵約束)
保證資料的完整性和一致性。
實現一對一或一對多關係。

外來鍵約束的要求
1.父表和子表須使用相同的儲存引擎,且禁止使用臨時表
分析:子表,指具有外來鍵列的表;
子表參照的表成為父表
2.資料表的儲存引擎只能InnoDB
3.外來鍵列(FOREIGN)和參照列必須具有相似的資料型別。其中數字長度或是否有符號為必須相同;而字元的長度則可以不同。
4.外來鍵列(FOREIGN)和參照列必須建立索引,若外來鍵列不存在索引的話,MySQL將自動建立索引。

編輯資料表的預設儲存引擎
MySQL配置檔案
default-storage-engine=INNODB

舉例:建立省份表(參照列id)
CREATE TABLE shengfen(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, pname VARCHAR(20) NOT NULL);
SHOW CREATE TABLE shengfen;
分析:檢視建立命令,確認是InnoDB引擎

下建立子表(外來鍵列pid)
CREATE TABLE users(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES shengfen (id));
分析:外來鍵列(FOREIGN)和參照列必須具有相似的資料型別才能建立成功
外來鍵列(FOREIGN)和參照列必須建立索引,該例子參照列有建立索引(FOREIGN KEY 會自動建立),下可以測試:SHOW INDEXES FROM shengfen\G;
SHOW INDEXES FROM users\G;

MySQL外來鍵約束的參照操作
1.CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行
2.SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL。若使用該選項,必須保證子表列沒有指定NOT NULL。
3.RESTIRICT:拒絕對父表的刪除或更新操作
4.NO ACTION:標準的SQL關鍵字,在MySQL中與RESTRICT相同。
舉例:CREATE TABLE users1(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES shengfen (id) ON DELETE CASCADE);
分析:父表刪操作時加了個CASCADE操作。即父表刪操作時也刪子表響應的行
下進行測試:
先在父表插入記錄:
INSERT shengfen(pname) VALUES(‘A’);
INSERT shengfen(pname) VALUES(‘B’);
INSERT shengfen(pname) VALUES(‘C’);
SELECT * FROM shengfen;
INSERT users1(username,pid) VALUES(‘TOM’,3);// 插入成功
INSERT users1(username,pid) VALUES(‘John’,7);// 插入失敗,改為(‘John’,1)
INSERT users1(username,pid) VALUES(‘Rose’,3);// 插入成功
SELECT * FROM users1;
DELETE FROM shengfen WHERE id=3;
SELECT * FROM shengfen;
SELECT * FROM user1;

以上約束只支援InnoDB引擎

MySQL表級約束與列級約束
對一個數據列建立的約束,成為列級約束。
對多個數據列建立的約束,成為表級約束。
列級約束即可在列定義時宣告,也可在列定義後宣告。表級約束只能在列定義後宣告。

修改資料表-新增/刪除列
新增單列
ALTER TABLE tbl_name ADD [COLUMN] col_name col_defintion [FIRST|AFTER col_name]
分析:FIRST|AFTER插在列前後
舉例:
SHOW COLUMNS FROM users1;
ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;
ALTER TABLE users1 ADD password VARCHAR(32) NOT NULL AFTER username;
ALTER TABLE users1 ADD truename VARCHAR(20) NOT NULL FIRST;
SHOW COLUMNS FROM users1;

新增多列
ALTER TABLE tbl_name ADD [COLUMN] (col_name col_defintion,…..)
只能插到最後

刪除列
ALTER TABLE tbl_name DROP [COLUMN] col_name;
舉例:
ALTER TABLE users1 DROP truename;
SHOW COLUMNS FROM users1;
刪除多列
ALTER TABLE users1 DROP password, DROP age;
SHOW COLUMNS FROM users1;

MySQL修改資料表–新增約束
新增主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,…)
舉例:
CREATE TABLE users2(username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED);
SHOW CREATE TABLE users2;
ALTER TABLE users2 ADD id SMALLINT UNSIGNED;
SHOW COLUMNS FROM users2;
ALTER TABLE users2 ADD CONSTRAINT PK_users_id PRIMARY KEY (id);
SHOW COLUMNS FROM users2;
分析:CONSTRAINT PK_users_id可以不寫

新增唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_type] (index_col_name,…)
舉例:
ALTER TABLE users2 ADD UNIQUE KEY (username);
SHOW CREATE TABLE users2;

新增外來鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_definition
舉例:
SHOW COLUMNS FROM shengfen;
ALTER TABLE users2 ADD FOREIGN KEY (pid) REFERENCES shengfen (id);

新增/刪除預設約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal|DROP DEFAULT}
舉例:
ALTER TABLE users2 ADD age TINYINT UNSIGNED NOT NULL;
SHOW COLUMNS FROM users2;
ALTER TABLE users2 ALTER age SET DEFAULT 15;
SHOW COLUMNS FROM users2;

MySQL修改資料表–刪除約束
刪除主鍵約束
ALTER TABLE tbl_name DROP PRIMARY KEY
舉例:
ALTER TABLE users2 DROP PRIMARY KEY ;
SHOW COLUMNS FROM users2;

刪除唯一約束
ALTER TABLE tbl_name DROP {INDEX|KEY} index_name
舉例:
SHOW INDEXES FROM users2\G;
ALTER TABLE users2 DROP INDEX username;
//刪除的是約束而不是欄位
SHOW COLUMNS FROM users2;
SHOW INDEXES FROM users2\G;

刪除外來鍵約束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
舉例:
SHOW CREATE TABLE users2;//找到約束名稱
ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;
SHOW CREATE TABLE users2;
//發現外來鍵已刪除,還存在索引。欲刪除索引,
ALTER TABLE users2 DROP INDEX pid;

MySQL 修改資料表–修改列定義和更名資料表
修改列定義
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST|AFTER col_name]
舉例:
ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;
SHOW COLUMNS FROM users2;
ALTER TABLE users2 MODIFY id TINYINT UNSIGNED NOT NULL;
SHOW COLUMNS FROM users2;
//大型別改到小型別,資料可能丟失

修改列名稱
ALTER TABLE tbl_name CHANGE[COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
//可改定義,也可該名稱
舉例:
ALTER TABLE users2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;
SHOW COLUMNS FROM users2;

資料表更名
方法1:
ALTER TABLE tbl_name RENAME[TO/AS] new_tbl_name
方法2:
RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2]
舉例:
ALTER TABLE users2 RENAME users3;
SHOW TABLES;

法2:RENAME TABLE users3 TO users2;
SHOW TABLES;

這裡寫圖片描述