1. 程式人生 > >MySQL 約束和修改資料表

MySQL 約束和修改資料表

1.     FOREIGN KEY(外來鍵約束):保持資料的一致性,完整性。實現資料表的一對一,一對多的關係。
a)     父表(子表所參照的表)和子表(具有外來鍵列的表)必須使用相同的儲存引擎,而且禁止使用臨時表。
b)     資料表的儲存引擎只能為InnoDB(可在my.ini檢視修改。5.7版本my.ini地址:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini)。
c)      外來鍵列(曾經加過foreign關鍵詞的那一列)和參照列(外來鍵列所參照的那列)必須具有相似的資料型別(字元,整型,日期時間等)。其中數字的長度或是否有符號位(如整型有無符號(unsigned)和有符號(signed)兩種型別;)必須相同;而字元的長度則可以不同。比如說父表裡面有一個引數id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,子表裡面就要寫作pid SMALLINT UNSIGNED(符號位和資料型別要相似)
d)     外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,MySQL將自動建立索引。

2.     外來鍵約束的參照操作

CASCADE:四個選項指在進行外來鍵約束的建立以後,在更新表的時候子表是否也進行相應操作。
例如:ON DELECT+CASCADE/SET NULL/RESTRICT/NO ACTION 在刪除的時候進行什麼樣的操作
SELECT*FROM tb_name(檢視插入的記錄是否存在)
刪除某條記錄 DELETE*FROM tb_name Where id/username(屬性)=xx;
CASCADE:在父表刪除/更新記錄時子表的記錄也被刪除/更新;
SET NULL://
從父表刪除或更新行,會設定子表中的外來鍵列為NULL,如果使用該選項,必須保證子表列沒有指定NOT NULL
RESTRICT://拒絕對父表的刪除或更新操作;
NO ACTION://標準的SQL語句,在MYSQL當中與RESTRICT相同
實際開發中,我們很少使用物理的外來鍵約束,而是使用邏輯約束;物理的外來鍵約束只有innoDB這種儲存引擎才會支援,MYISAM這種引擎就不支援物理的外來鍵約束。反過來說,當我們使用到的引擎為MYISAM時,只能使用邏輯外來鍵(即兩個表的設計的邏輯關係)。

3.     表級約束和列級約束

對於一個列所建立的約束,稱之為列級約束,而對於兩個或兩個以上的列所建立的約束,我們稱之為表級約束,列級約束在使用的時候,既可以在列定義的時候宣告,也可以在列定義以後宣告,而表級的約束只能在列定義以後來宣告,在實際開發中,用列級約束比較多,表級約束很少用,除此之外,在所有的約束中,並不是說每種約束都存在著表級或列級約束,其中,NOT NULL 
非空約束,DEFAULT約束這兩種約束就不存在表級約束,它們只有列級約束,而對於其他的三種,像主鍵,唯一,外來鍵,它們都可以存在表級和列級約束。

4.     修改資料表

1)     新增、刪除列

刪除列:ALTER TABLE tb1_name DROP[COLUMN] col_name;
新增多列:ALTER TABLE tb1_name ADD[COLUMN] (col_name column_definition,...);
新增單列:ALTER TABLE tb!_name ADD[COLUMN] col_name column_definition [FIRST|AFTER col_name];
多個操作可以同時操作,用逗號分開

2)     修改資料表—新增約束

新增主鍵約束(只能新增一個)
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol自定義的約束的名稱]] PRIMARY KEY [index_type] (index_col_name,...)
例如:ALTER TABLE 表格名 ADD CONSTRAINT PE_表格名_id PRIMARY KEY (id);
新增唯一約束(可以新增多個)
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [index_type] (index_col_name,...)
例如:ALTER TABLE 表格名 ADD UNIQUE (id);
新增外來鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_type] (index_col_name,...) reference_definition 
例:ALTER TABLE t3 ADD FOREIGN KEY (age)REFERENCES t2(age);
新增/刪除預設約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name SET DAFAULT literal(比如age裡面可設定為10,20 |DROP DEFAULT
例:ALTER TABLE user2 ALTER age SET DEFAULT 15;
ALTER TABLE user2 ALTER age DROP DEFAULT;
3)     修改資料表—刪除約束
刪除主鍵約束
ALTER TABLE 資料表名 DROP PRIMARY KEY;
為什麼資料表後沒指定名字:任何資料表有且只有一個主鍵約束
刪除唯一約束
ALTER TABLE 資料表名 DROP INDEX id;
刪除外來鍵約束
ALTER TABLE 資料表名 DROP FOREIGN KEY users2_ibfk_1(可用show方法檢視帶下劃線名);
4)     修改列定義
1.用關鍵字ALTER TABLE..MODIFY
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST |AFTER col_name];
ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST; //將id欄位的位置提到第一列
SHOW COLUMNS FROM users2;
ALTER TABLE users2 MODIFY id TINYINT UNSIGNED NOT NULL; //修改資料型別,需注意資料丟失的問題
2.修改列名稱,用CHANGE方法可以同時修改列名稱和列定義.
用關鍵字ALTER..CHANGE
ALTER TABLE tbl_name CHANGE [COLUMN] col_name new_col_name column_definition [FIRST|AFTER col_name];
ALTER TABLE users2 CHANGE pid p_id TINYINT UNSIGNED; //修改列名稱
3.更換資料表名
用關鍵字ALTER..RENAME
修改一個表的表名(方法1)
ALTER TABLE users2 RENAME person;
修改一個表的表名(方法2)
用關鍵字RENAME..TO
RENAME TABLE users5 TO users2;
一次修改多個表的表名,操作間用逗號隔開.
RENAME TABLE users5 TO users2,users3 TO users4;
應該少使用資料表的列名及表名的更名。