MySQL 約束和修改資料表
阿新 • • 發佈:2019-02-13
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;
應該少使用資料表的列名及表名的更名。