mysql學習筆記(二)
阿新 • • 發佈:2020-12-05
此學習筆記根據慕課網課程“與MYSQL的零距離接觸”學習總結
3.約束以及修改資料表
3-1 外來鍵約束的要求解析
外來鍵約束:保證資料一致性、完整性,實現一對一或一對多關係。
FOREIGN KEY (外來鍵列名稱) REFERENCES 父表(參照列名稱);
外來鍵約束的要求:
- 父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表
- 資料表的儲存引擎只能為InnoDB。
- 外來鍵列和參照列必須具有相似的資料型別。其中數字的長度或是否有符號位必須相同;而字元的長度則可以不同。
- 外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,MySQL將自動建立索引。
顯示索引:SHOW INDEXES FROM 表名; 或者:SHOW INDEXES FROM 表名\G;(以網格的形式來呈現) 刪除索引:ALEER TABLE tbl_name DROP INDEX 索引名稱;
3-2 外來鍵約束的參照操作
1.CASCADE 從父表刪除或更新且自動刪除或更新子表中匹配的行
2.SET NULL
從父表刪除或更新行,並設定子表中的外來鍵列為NULL。如果使用該選項,必須保證子列表沒有指定NOT NULL
3.RESTRICT 拒絕對父表的刪除或更新操作
4.NO ACTION 標準SQL的關鍵字,在MySQL中與RESTRICT相同。
語法結構:FOREIGN KEY (外來鍵列名稱) REFERENCES 父表(參照列名稱) ON DELETE CASCADE;
mysql> CREATE TABLE users1( -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -> username VARCHAR(10) NOT NULL, -> pid SMALLINT UNSIGNED, -> FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE -> ); Query OK, 0 rows affected (0.53 sec)
3-3 表級約束與列級約束
對一個數據列建立的約束,稱為列級約束。
對多個數據列建立的約束,稱為表級約束。
列級約束既可以在列定義時宣告,也可以在定義後宣告。
表級約束只能在列定義後宣告。
3-4 新增/刪除列
新增單列:
ALTER TABLE tbl_name ADD col_name column_definition FIRST | AFTER col_name;
ALTER TABLE 表名稱 ADD 列名稱 列定義 FIRST | AFTER 列名稱;
FIRST將新新增的這一列置於所有列最前面
AFTER col_name 將新新增的列置於你指定列的後方
如果省略FIRST | AFTER col_name,則置於所有列之後
新增多列:
ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,
……
);
新增多列時不能指定位置關係,只能在原來資料列的下方。
刪除單列:
ALTER TABLE tbl_name DROP col_name;
刪除多列:
ALTER TABLE tbl_name DROP col_name1,DROP col_name2;
3-5 新增/刪除約束 (注:col_name:列名稱)
新增/刪除主鍵約束:
ALTER TABLE tbl_name ADD PRIMARY KEY (col_name);
ALTER TABLE tbl_name DROP PRIMARY KEY;
新增/刪除唯一約束:
ALTER TABLE tbl_name ADD UNIQUE (col_name);
ALEER TABLE tbl_name DROP INDEX 索引名稱; (也可以用於刪除其他索引)
新增/刪除外來鍵約束:
ALTER TABLE tbl_name ADD FOREIGN KEY (外來鍵列名稱) REFERENCES 父表(參照列名稱);
ALTER TABLE tbl_name DROP FOREIGN KEY 約束名稱; (外來鍵約束名稱通過SHOW CREATE TABLE tbl_name 檢視)
例如:| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL,
`id` smallint(5) unsigned NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
KEY `pid` (`pid`),
CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
mysql> ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;
新增/刪除預設約束:
ALTER TABLE tbl_name ALTER col_name SET DEFAULT 預設值;
ALTER TABLE tbl_name ALTER col_name DROP DEFAULT;
3-6 修改列定義和更名資料表
修改列定義:
ALTER TABLE tbl_name MODIFY col_name column_definition FIEST | AFTER col_name;
ALTER TABLE 表名稱 MODIFY列名稱 列定義 FIRST | AFTER 列名稱;
修改列名稱:(除了修改列定義還可以修改列名稱)
ALTER TABLE tbl_name CHANGE old_col_name new_col_name column_definition FIRST | AFTER col_name;
ALTER TABLE tbl_name CHANGE 舊的列名稱 新的類名稱 列定義 FIRST | AFTER col_name;
資料表更名:
方法1:
ALTER TABLE tbl_name RENAME new_tbl_name;
方法2:
RENAME TABLE tbl_name TO new_tbl_name;
總結
約束:
按功能劃為 | NOT NULL(非空約束) |
PRIMARY KEY(主鍵約束) | |
UNIQUE KEY(唯一約束) | |
DEFAULT(預設約束) | |
FOREIGN KEY(外來鍵約束) |
按資料列的數目劃為 | 表級約束 |
列級約束 |
修改資料表:
針對欄位的操作:新增/刪除欄位、修改列定義、修改列名稱等
針對約束的操作:新增/刪除各種約束
針對資料表的操作:資料表更名(兩種方式)
未完待續。。。